IE8 для ... в перечислителе - PullRequest
12 голосов
/ 31 января 2012

Так что я использую это в 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

В chrome и других я просто получу 0-3, ничего загадочного "indexOf". Почему и в чём дело?

Ответы [ 3 ]

23 голосов
/ 31 января 2012

Не используйте 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];
    ...
  }
}

Для ясности: вам все же не следует использовать этот метод для массивов.

7 голосов
/ 31 января 2012

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

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

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

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

4 голосов
/ 31 января 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...