2012-01-31 2 views
12

Так я использую это в IE8:IE8 для ... в перечислителе

var hi=["hi", "lo", "foo", "bar"]; 
for(i in hi){console.log(i)}; 
//WTF is that indexOf i value? 
LOG: 0 
LOG: 1 
LOG: 2 
LOG: 3 
LOG: indexOf 
undefined 

В хроме и других, я просто получить 0-3, не таинственную «IndexOf» вещи. Почему и в чем проблема?

ответ

23

Не использовать for...in для массивов. В этом случае лучше использовать традиционную петлю for.

Причина в том, что for...in рассматривает массив как объект, и поэтому свойства, подобные indexOf или length, могут быть включены в цикл. Нормальный цикл for использует только цифровые клавиши, поэтому эту проблему можно избежать.

На стороне примечания нежелательные свойства могут появляться при повторении и простых объектов (как отмечали другие, будут добавлены свойства, которые вы добавляете к прототипу объекта). Вы можете обойти эту проблему, написав for...in Loops следующим образом:

var obj = { ... }; 
for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) { 
    var item = obj[prop]; 
    ... 
    } 
} 

Чтобы быть ясно, хотя вы еще не должны использовать этот метод на массивах.

+0

спасибо! Ниндзя ... – randomor

7

Вы используете неправильный тип петли для массива - for ... in ... будет также включать в себя любые перечисляемых свойства объекта, который в вашем случае включает в себя метод .indexOf().

Используйте вместо этого:

var i, n = hi.length; 
for (i = 0; i < n; ++i) { 
    console.log(i, hi[i]); 
} 

Chrome и другие до даты браузеров реализации ECMAScript 5, и правильно маркировать все встроенные методы, как несчетных свойств.

+1

Ха, мы снова сражаемся! – benekastah

+0

'indexOf' не является методом массива в IE8, он добавляется от пользователя, поэтому он появляется – Esailija

+0

IE8 не имеет' indexOf() '? Вау... – Alnitak

4

Это происходит потому, что скрипт, который вы указываете на своей странице, добавляет метод indexOf к Array.prototype. Это означает, что все массивы наследуют метод indexOf, что хорошо, поскольку это означает, что вы можете использовать этот метод даже в IE8.

Но, поскольку в IE8 невозможно указать свойство как неперечислимое, вы увидите его каждый раз, когда перечисляете все свойства массива, что вы делаете в for - in петля. Вероятно, вам понадобился цикл for.

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