Не используйте for..in
для итерации Array.
Важно понимать, что синтаксис квадратных скобок Javascript Array ([]
) для доступа к указателям фактически унаследован от Object
...
obj.prop === obj['prop'] // true
Структура for..in
не работает, как более традиционная for..each/in
, которая встречалась бы в других языках (php, python и т. Д.).
Javascript's for..in
предназначен для перебора свойств объекта .Создание ключа каждого свойства.Используя эту клавишу в сочетании с синтаксисом скобок Object
, вы можете легко получить доступ к нужным значениям.
var obj = {
foo: "bar",
fizz: "buzz",
moo: "muck"
};
for ( var prop in obj ) {
console.log(prop); // foo / fizz / moo
console.log(obj[prop]); // bar / buzz / muck
}
И поскольку массив - это просто объект с последовательные числовые имена свойств (индексы) for..in
работает аналогичным образом, производя числовые индикаторы точно так же, как и имена вышеупомянутых свойств.
Важной характеристикой структуры for..in
являетсячто он продолжает искать перечисляемые свойства в цепочке прототипов.Он также будет повторять наследуемые перечисляемые свойства .Вы должны убедиться, что текущее свойство существует непосредственно в локальном объекте, а не в прототипе, к которому оно прикреплено с помощью hasOwnProperty()
...
for ( var prop in obj ) {
if ( obj.hasOwnProperty(prop) ) {
// prop is actually obj's property (not inherited)
}
}
( Подробнее о наследовании прототипа )
Проблема с использованием структуры for..in
для типа Array заключается в том, что нет гарантии того, в каком порядке создаются свойства ... и, вообще говоря, это очень важная особенность обработкимассив.
Другая проблема заключается в том, что он обычно медленнее, чем стандартная for
реализация.
Итог
Использование for...in
дляитеративные массивы - это все равно, что использовать отвертку для забивания гвоздя ... почему бы вам просто не использовать молоток (for
)?