2012-05-26 2 views
1

Вдохновленный Lance Pollard's comment in this question, что-то действительно странное произошло, и я никогда не видел это раньше ...Что это? «Скрытые значения»?

var strangeArray = { 
    0:"a", 
    1:"b", 
    2:"c", 
    length: 0, 
    splice: Array.prototype.splice 
} 

Теперь, когда вы запустите его:

> strangeArray; 
    [] <-- you get an empty array. 

> strangeArray.length; 
    0  <-- Holy $#!T 

А теперь:

> strangeArray[0]; 
    "a" 

> strangeArray[1]; 
    "b" 

> strangeArray[2]; 
    "c" 

Что? "Скрытые значения в массиве"?

Сначала я думал, что это объект, вот почему. Но object должен показать, как это:

{} 

Так почему же это происходит? Пожалуйста, помогите, я совершенно смущен. Благодарю.

ответ

4

Это просто способ консоли часто интерпретируют объекта как Array (даже если это не массив на всех, как в вашем коде).

Когда консоль видит объект с ...

  • числовой .length свойством
  • функцией .splice свойства

... консоль решает, чтобы отобразить его в виде массива, даже если это не так. Это не влияет на то, что на самом деле объект.

strangeArray.length; // 0 

Это неудивительно. Вы определили его на объекте.

Причина, по которой они используют этот подход, предположительно потому, что она быстрая и достаточно точная.

Еще раз, потому что вы видите [], не означает, что это массив. Консоль не является частью языка. У него просто есть работа по отображению некоторой полезной информации.

+0

«' [] 'не означает, что это массив» В отличие от того, что я знал годами ... –

+0

@Derek: '[]' это не то, что вы ввели в свой JS-код, который должен интерпретироваться JS-движком , В вашем случае '[]' - это просто текст, отображаемый в консоли. Опять же, консоль не является частью языка. Консоль разработчика может отображать все, что захочет, и это не нарушит никаких правил ... потому что их нет. –

+0

... позвольте мне сказать так. Если какой-то разработчик консольных консолей решил отобразить '[]' каждый раз, когда он получил номер '42', это сделает номер' 42' Array? Конечно нет. Это все еще номер, но консоль решила отобразить его, как если бы это был массив, независимо от того, что это на самом деле. –

3

strangeArray.length == 0 потому что вы явно задали strangeArray.length как целое число 0, переопределяя его значение по умолчанию.

массив все еще содержит элементы:

for (var i in strangeArray) { 
    console.log(i); 
} 

Выходы:

0 
1 
2 
length 
splice 
+1

Но почему оно отображает '[]' вместо чего-то еще? –

+0

Установите 'strangeArray.length = 1' и посмотрите, что произойдет. Я предполагаю, что компилятор JavaScript проверяет длину массива перед его отображением. – Blender

+0

Ничего себе, теперь он отображает '[" a "]' ... –

0

Все объекты в javascript. См. Ответ на следующий вопрос для получения подробного объяснения:
How is almost everything in Javascript an object?

Учитывая, что ответ сообщества wiki дает остальную часть объяснения. Поскольку вы даете свойства объекта strangeArray, обычно связанные с объектом array, вы обманываете консоль, отображая ее как таковую.

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