Подтвердить что ты не робот

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". Почему и какое исправление?

4b9b3361

Ответ 1

Не используйте for...in для массивов. Лучше всего использовать традиционный цикл for в этом случае.

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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