2016-06-11 3 views
0

Я читал an article about javascript PRNGs, и я наткнулся на что-то, что меня удивило:(Почему) установка `array [NaN]` ничего не делает?

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

a теперь [] и исключение не выбрасывается - записываемый в массив просто исчезает. Попробуйте его в консоли браузера, если вы мне не верите.

Я не поверил ему, так что я попробовал его в моем браузере консоли (Firefox 47):

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

» a 
← Array [ ] 
» b 
← NaN 

Есть несколько любопытных вещей происходит здесь, но, в частности, я пытаясь понять, почему в заявлении a[b++] = 1 ничего не появляется.

+4

Это делает - он назначен '1' до' а [NaN] '. Попробуйте получить доступ к 'a [NaN]', чтобы увидеть, что он есть. Это также скользкая дорога - вы ожидаете чего-то от объекта-хозяина, который не стандартизирован («консоль» - нет). Итак, откуда вы знаете, что вы видите * ожидается * или нет? – zerkms

ответ

0

Принимая его из верхней части:

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

'Отступ b с одним, неопределенным + 1 === NaN'? Почему «отступ»? И 'b ++' не совпадает с 'b + 1'. – melpomene

+0

Я думаю, я пытался сказать: 'Добавить один в b'. – andlrc

1

Там много чего происходит.

  1. код делает что-то - он присваивает значение 1 к a[NaN]. И как только объекты JS могут иметь только строковые свойства, NaN неявно ливается в строку, поэтому на самом деле вы назначили 1 на a["NaN"] или a.NaN.

  2. Объект console не стандартизован, поэтому вы не можете ожидать от него ничего особенного. Текущая реализация в FF, хотя итерации через индексы массива. "NaN" не является индексом массива, поскольку он даже не численный, поэтому на консоли ничего не отображается.

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

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

+0

@Mgetz сторона примечание: она сначала преобразуется в строку, поэтому не имеет значения, является ли 'NaN' не равным себе. «как индекс в объекте массива» --- это не так, индекс по стандарту может быть только числовым (есть больше ограничений, но в этом случае это не имеет значения). – zerkms

Смежные вопросы