Javascript: зачем использовать цикл for вместо цикла for-in для массивов?

Я читал Object-Oriented Javascript Стояна Стефанова, и в какой-то момент он пишет:

Цикл for-in используется для перебора элемента массива (или объекта, как мы увидим позже). Это единственное использование; его нельзя использовать в качестве универсального механизма повторения, заменяющего for или while. Давайте посмотрим на пример использования for-in для перебора элементов массива. Но имейте в виду, что это только для информационных целей, так как for-in в основном подходит для объектов, а обычный цикл for следует использовать для массивов.

В прошлом я всегда использовал циклы for при переборе элементов массива, и я обычно видел циклы for, а не циклы for-in, используемые для этой цели, но по какой причине «обычный цикл for следует использовать для массивов»?


person James    schedule 09.07.2011    source источник
comment
возможный дубликат JavaScript For...in with Arrays   -  person Bergi    schedule 20.06.2012


Ответы (3)


Проблема в том, что некоторые библиотеки (на ум приходит Prototype) расширяют тип массива, поэтому, когда вы используете циклы for in, он затрагивает все свойства enumerable в этом массиве, который включает в себя все элементы массива, а также все добавленные свойства. или методы. Не то, что вы хотите, чтобы произошло.

Цикл for i in выполняет итерацию только по элементам массива, то есть ко всему, что вы буквально определили бы как [1, 2, 3, 4].

person Alex Mcp    schedule 09.07.2011

Причина использования обычных циклов for для массивов заключается в том, что они ограничивают итерацию индексированными значениями.

Если вы используете цикл for-in, он будет перебирать все свойства объекта (массив — это объект) и может дать неожиданные результаты, если вы прикрепите произвольные свойства к массиву, который не имеет числового индекса.

person Peter    schedule 09.07.2011

Ну, я в основном использую его, когда не знаю точного количества элементов в массиве. в общем случае он используется для перебора элементов, когда массив заполняется динамически или на лету.

person samach    schedule 09.07.2011
comment
Это не имеет смысла, потому что длина массива всегда доступна с x.length. Циклы моего массива выглядят так: for (var i=0,len=x.length;i‹len;i++)) - person jfriend00; 10.07.2011