2016-06-11 4 views
0

Ich las an article about javascript PRNGs, und ich kam in etwas, das mich überrascht:(Warum) macht das Setzen von `Array [NaN]` nichts?

var a = new Array(); 
var b; 
a[b++] = 1; 

a ist jetzt [] und keine Ausnahme ausgelöst wird - die Schreib einfach verschwindet mit dem Array. Probieren Sie es in Ihrer Browser-Konsole aus, wenn Sie mir nicht glauben.

ich glaubte ihm nicht, so habe ich versucht, es in meinem Browser-Konsole aus (Firefox 47):

» var a = new Array(); 
» var b; 
» a[b++] = 1 

» a 
← Array [ ] 
» b 
← NaN 

Es gibt mehrere seltsame Dinge hier los ist, aber vor allem, ich bin versuchen zu verstehen, warum die Aussage a[b++] = 1 nichts zu tun scheint.

+4

Es tut - es die '1' an den 'a [NaN]' zugeordnet. Versuche auf 'a [NaN]' zuzugreifen, um zu sehen, dass es da ist. Es ist auch eine glatte Straße dort - Sie erwarten etwas von einem Host-Objekt, das nicht standardisiert ist (die "Konsole" ist nicht). Also, wie weißt du, was du siehst, ist * erwartet * oder nicht? – zerkms

Antwort

0

es von oben Punkt:

var a = new Array(); 
// 'a' is now an empty array, plain ol' boring empty array, could have been 
// written as a = []; 
var b; 
// 'b' have no value and is 'undefined'. 'console.log(b); // undefined' 
a[b++] = 1; 
// Lets break the above statement down into pieces: 
    b++  // Increment b by one, undefined + 1 === NaN 
a[ ]  // Use NaN as a property for our array 'a' 
     = 1; // Assign 1 to that property 
// Ok? So what happened why does 'a' still look empty? 
console.log(a); // [] 
// The way your console with show you an array is by printing the numeric keys 
// in it, and looking at the length, eg: 
// var q = []; 
// q.length = 1; 
// console.log(q); // [undefined x 1] 

// With 'a' in our case there is no numeric keys in it so [] is printed. 
// So did our value dissapear? 
// No. It is there: 
console.log('NaN' in a); // true 
// And: 
for (var prop in a) console.log(prop); // NaN 

// Why is this even a feature? 
// Arrays are extending Objects so they have the same properties as em. 
console.log(a instanceof Object); // true 
console.log(a instanceof Array); // true 
+0

'Indent b mit einem, undefined + 1 === NaN'? Warum "Einzug"? Und 'b ++' ist nicht dasselbe wie 'b + 1'. – melpomene

+0

Ich glaube, ich wollte sagen: 'Add one to b'. – andlrc

1

Dort passiert eine Menge Dinge.

  1. Der Code macht etwas - es weist den Wert 1 zum a[NaN]. Und sobald JS-Objekte nur String-Eigenschaften haben können - die NaN wird implizit in eine Zeichenkette umgewandelt, also haben Sie 1 an a["NaN"] oder a.NaN vergeben.

  2. Das Objekt console ist nicht standardisiert, Sie können also nichts Besonderes erwarten. Die aktuelle Implementierung in FF durchläuft jedoch die Array-Indizes. "NaN" ist kein Array-Index, da er nicht numerisch ist, daher wird in der Konsole nichts angezeigt.

var a = new Array(); 
 
var b; 
 
a[b++] = 1; 
 

 
console.log(a[NaN], a["NaN"], a.NaN);

+0

@Mgetz eine Randnotiz: Es wird zunächst in eine Zeichenfolge umgewandelt, so dass es egal ist, ob die 'NaN' nicht gleich ist. "als ein Index in einem Array-Objekt" --- es ist nicht, Index wie der Standard kann nur numerisch sein (es gibt mehr Einschränkungen, aber in diesem Fall sind diese nicht wichtig). – zerkms