2013-05-22 5 views
0

В настоящее время я использую jquery 1.8.3. Я думаю, что он добавил indexOf в Array.prototype, поэтому теперь каждый мой массив всегда содержит метод indexOf в качестве первого элемента. Выполнение for (var i in object) Я всегда получаю метод infexOf как мой первый элемент, и он прослушивал мой код.IE8 Array и indexOf конфликт

Ошибка произошла только на IE8.

Я хочу удалить этот indexOf из всех массивов или, во всяком случае, взломать jquery/решить эту проблему.

PS: Я даже не уверен, если это JQuery является причиной этой проблемы

Спасибо.

+9

jQuery ничего не добавляет к нативным объектам. Это должно происходить откуда-то еще. Вы не должны использовать 'for ... in' для итерации по массивам в любом случае (см. Описание [MDN description] (https: //developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for ... в # Описание) (вторая желтая рамка)). Используйте цикл 'for' или jQuery' $ .each'. –

+1

'Array.indexOf' не реализован в IE8, и я не думаю, что jQuery добавляет его. [См. Таблицу совместимости] (https: //developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf # Browser_compatibility) –

+2

Я только что проверил источник, JQuery определенно не добавляет 'indexOf'. –

ответ

1

Правильный ответ здесь заключается в том, что вы не должны использовать цикл 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, чтобы проверить свой стиль кодирования, он будет жаловаться, если вы этого не сделаете.

3

Помимо не используя for...in перебрать массив, если вы должны использовать for...in, а затем объединить его с hasOwnProperty сказать, если свойство вы смотрите на самом деле относится к объекту в вопросе, или пришел от прототипа:

for (var prop in myObject) { 
    if (myObject.hasOwnProperty(prop)) { 
     // this didn't come from the prototype. 
    } 
} 
Смежные вопросы