Почему 'для (объект var в списке)' с массивами, которые рассматривают плохой практикой в JavaScript?

Учитывая простой базирующийся нуль, численно индексный массив:

var list = ['Foo', 'Bar', 'Baz'];

Много раз я заметил это, когда кто-то предлагает цикличное выполнение через переменные в массиве как это:

for(var item in list) { ... }

... существует почти наверняка кто-то предполагающий, что это - плохая практика и предлагает альтернативный подход:

var count = list.length;

for(var i = 0; i < count; i++) {
    var item = list[i];
    ...
}

Каково обоснование для того, чтобы не использовать более простую версию выше и использовать второй пример вместо этого?

72
задан Tatu Ulmanen 15 February 2010 в 10:10
поделиться

4 ответа

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

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

Array.prototype.remove = function(val) {
    // Irrelevant implementation details
};

var a = ["a", "b", "c"];

for (var i in a) {
    console.log(i);
}

// Logs 0, 1, 2, "remove" (though not necessarily in that order)
89
ответ дан 24 November 2019 в 12:43
поделиться

Добавьте list.foo = bar; и попробуйте использовать простой для . Если вы не используете некоторые библиотеки (например, prototypeJs) и не добавляйте никаких новых свойств к объекту массива - вы можете использовать простой оператор for.

0
ответ дан 24 November 2019 в 12:43
поделиться

Если вы используете for/in подобным образом, item перечисляет через строковые значения "0", "1", ..., то есть не реальные объекты в списке. Поэтому "элемент" в первом фрагменте больше похож на i во втором фрагменте, а не на item. Кроме того, строковые значения перечисляются там, где ожидаются числа. И у вас возникнут проблемы, когда вы добавите в список свойства, например array.ID = "a123", поскольку они также будут перечислены.

Но, несмотря на эти недостатки, я все равно считаю синтаксис очень полезным, если ваша команда понимает, что он делает.

1
ответ дан 24 November 2019 в 12:43
поделиться

Скорость? Цикл

for (..; ..; ..) оказался в 36 раз быстрее, чем for .. в , когда я тестировал его здесь.

Ссылка любезно предоставлена ​​этим SO-ответом

17
ответ дан 24 November 2019 в 12:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: