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