Правильный ответ здесь заключается в том, что вы не должны использовать цикл for(...in...)
для итерации массива в Javascript.
Весь смысл наличия массива состоит в том, что он имеет пронумерованную последовательность элементов, поэтому вы должны использовать цикл for()
.
for(var i=0; i<myArray.length; i++) {
//do stuff here with myArray[i]
}
в одиночку, что позволит решить проблему в данном случае, потому что это будет только итерации пронумерованных элементов, так что метод indexOf
не увлекаться.
Однако краткие объяснения проблемы с for(..in..)
здесь может быть полезными, поэтому позвольте мне объяснить ...
Основная причина ошибки вы видите, это потому, что метод indexOf
не поддерживается массивов в IE8, поэтому что-то в вашем коде (но не jQuery) добавило его в прототип Array.
Это, в свою очередь, означает, что когда вы выполните цикл for(..in..)
, он будет выбран как один из элементов для повторения.
В этом случае у вас есть лучшее решение (цикл for()
, см. Выше), но в тех случаях, когда вам действительно нужно использовать цикл for(..in..)
, это может быть реальной проблемой. Вы можете предотвратить это, проверив hasOwnProperty()
непосредственно внутри цикла for(..in..)
. Эта функция возвращает false
для элементов, которые являются частью прототипа объекта, поэтому помогает избежать попадания нежелательных методов при циклировании объекта.
Это считается лучшей практикой для каждого цикла for(..in..)
. Фактически, если вы используете такой инструмент, как JSLint, чтобы проверить свой стиль кодирования, он будет жаловаться, если вы этого не сделаете.
jQuery ничего не добавляет к нативным объектам. Это должно происходить откуда-то еще. Вы не должны использовать 'for ... in' для итерации по массивам в любом случае (см. Описание [MDN description] (https: //developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for ... в # Описание) (вторая желтая рамка)). Используйте цикл 'for' или jQuery' $ .each'. –
'Array.indexOf' не реализован в IE8, и я не думаю, что jQuery добавляет его. [См. Таблицу совместимости] (https: //developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf # Browser_compatibility) –
Я только что проверил источник, JQuery определенно не добавляет 'indexOf'. –