Вы не первый, кто смешивает массивы и объекты. ТАК должен содержать FAQ для такого рода вопросов;)
Давайте попробуем объяснить:
Массив - это строка значений, которую можно получить, используя их положение в строке. Порядок значений массива является фиксированным (и может быть переупорядочен).
Объект - это переменная, которая содержит именованные свойства в форме пар ключ-значение. Порядок пар ключ-значение, принадлежащих объекту, произвольный.
Массив выглядит так: [ 'first', 'second', 'third', ..., 'nth' ]
Объект выглядит так: { first:'firstvalue', second:'secondvalue', ..., nth:'nthvalue' }
Первый элемент массива - это элемент с индексом 0 (поэтому первая позиция в строке имеет значение индекса 0). Вы получаете его, используя myArray[0]
Объект неупорядочен, поэтому у него нет первого элемента. Вы извлекаете из него любой элемент, используя myObject.somekey
или myObject['somekey']
.
Для массивов вы используете цикл, проходящий по нумерованному индексу до достижения конца массива:
var i=0, len = myArray.length;
for ( i; i<len; i++ ) {
//do something with >>> myArray[i] <<<
}
Для объектов вы используете цикл с ключом и оператором in
(убедитесь, что вы получаете только определенные пользователем свойства объекта с помощью метода .hasOwnAttribute
):
for ( var key in myObject ){
if (myObject.hasOwnProperty(key)) {
// do something with >>> myObject[key] <<<
}
}
По сути, представьте массив как шкаф с выдвижными ящиками, каждый из которых содержит значение. Объект можно представить как груду коробок с наклейками на крышке, описывающими содержимое коробки. При извлечении чего-либо из объекта вы спрашиваете: есть ли коробка с наклейкой y в стопке x и, если да, что в ней ? Получая что-то из массива, вы спрашиваете: , пожалуйста, дайте мне содержимое ящика № х .
Теперь по вашему вопросу : массив, для которого вы получаете значения с помощью цикла for..in
, содержит определенный пользователем метод, а именно indexOf
. Используя для этого цикл стиля объекта, массив обрабатывается как объект, и также отображается ключ indexOf
(со значением, например, function(){...}
, я уверен). IE. Поэтому при переборе массивов может быть лучше использовать традиционный цикл for с числовым индексом.
Почему это только в IE ? В современных браузерах indexOf
является нативным методом прототипа Array
, и нативные методы не отображаются (если вы не просматриваете их прототип). IE <9 не имеет собственного метода indexOf для массивов. Где-то в сценарии, который вы используете, метод был добавлен в прототип Array как пользовательское расширение. </p>
Итог вашей проблемы: не используйте for ... in
для циклического перебора значений массива.