Учитывая простой базирующийся нуль, численно индексный массив:
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];
...
}
Каково обоснование для того, чтобы не использовать более простую версию выше и использовать второй пример вместо этого?
Во-первых, порядок цикла не определен для цикла 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)
Добавьте list.foo = bar;
и попробуйте использовать простой для
.
Если вы не используете некоторые библиотеки (например, prototypeJs) и не добавляйте никаких новых свойств к объекту массива - вы можете использовать простой оператор for.
Если вы используете for/in подобным образом, item
перечисляет через строковые значения "0", "1", ..., то есть не реальные объекты в списке. Поэтому "элемент" в первом фрагменте больше похож на i
во втором фрагменте, а не на item
. Кроме того, строковые значения перечисляются там, где ожидаются числа. И у вас возникнут проблемы, когда вы добавите в список свойства, например array.ID = "a123"
, поскольку они также будут перечислены.
Но, несмотря на эти недостатки, я все равно считаю синтаксис очень полезным, если ваша команда понимает, что он делает.
Скорость? Цикл
for (..; ..; ..)
оказался в 36 раз быстрее, чем for .. в
, когда я тестировал его здесь.