2017-03-12 1 views
4

Kann jemand bitte dieses Verhalten von JavaScript-Arrays erklärenJavascript-Array mit Index Number.MAX_VALUE

//create an empty array 
var arr=[]; 

//added an entry with index Number.MAX_VALUE 
arr[Number.MAX_VALUE]="test" 

//On printing the array, its showing as empty 
arr 
//[] 

//even its length=0 
arr.length 
//0 

//on accessing the same value its showing the correct value 
arr[Number.MAX_VALUE] 
//"test" 

ich dies mit Number.MIN_VALUE versucht haben.

Kennt jemand den Grund dafür?

+0

'Number.MAX_VALUE' ist größer als die größte ganze Zahl, die ein numerischer Array-Index sein können, Es wird also kein Element erstellt oder die '.length'-Eigenschaft geändert, sondern eine Eigenschaft hinzugefügt. Wenn Sie das Array in der Konsole erweitern, sollten Sie die Eigenschaft mit dem tatsächlichen Namen sehen, der gesetzt wurde (ich sehe den String '" 1.7976931348623157e + 308 "'). – nnnnnn

+0

Übrigens passiert das Gleiche "1,5" oder eine andere Gleitkommazahl. –

+0

Es passiert auch mit jeder negativen Zahl, also ist das Verhalten mit 'Number.MIN_VALUE' keine Überraschung. – JJJ

Antwort

7

Number.MAX_VALUE ist kein gültiger Array-Index. According to the spec:

Ein ganzzahliger Index ist ein String-wertige Eigenschaftsschlüssel, die eine kanonische numerische Zeichenkette (siehe 7.1.16) und numerischer Wert ist, dessen entweder +0 oder eine positive ganze Zahl 2 ≤ -1. einen Arrayindex ist ein ganzzahliger Index, deren numerischer Wert i im Bereich 0 ≤ i − 1.

Jede Eigenschaft Name, der nach dieser Definition kein Array-Index ist, ist nur ein regelmäßige Eigenschaftsnamen, wie Sie durch den Schlüssel Ordnung (Array-Indizes sind in Ordnung, andere Eigenschaften sind in Auftrag) sehen:

var a = {}; 
a.prop = 'foo'; 
a[2 ** 32 - 2] = 'bar'; 
a[Number.MAX_VALUE] = 'baz'; 
console.log(Object.keys(a)); 
// ["4294967294", "prop", "1.7976931348623157e+308"] 
+1

Vielleicht erwähnen, dass es stattdessen eine regelmäßige Objekteigenschaft erstellt? –

-1

Es dauert Number.MAX_VALUE nicht wie einen Index, sondern wie ein Eigenschaftsnamen. Sie können gleiches Verhalten für jede Zeichenfolge

ein Eigenschaftsnamen P (in der Form eines Zeichenfolge -Wertes) sehen ist ein Array-Index, wenn und nur wenn ToString (ToUint32 (P)) gleich P und ToUint32 (P) nicht gleich (2^32) -1

(http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%201st%20edition,%20June%201997.pdf page65, Abschnitt 15.4)

+0

Aber ... 'Number.MAX_VALUE' ist eine Zahl, keine Zeichenkette. – nnnnnn

+0

Ryan gab eine nette Erklärung, warum es passiert. MAX_VALUE ist eine Zahl, ja, aber das Array kann es nicht als Index verwenden. – ekiyanov

+1

Ja, ich weiß, was passiert, ich denke nur, dass Sie klarer hätten sein können ... – nnnnnn