Подтвердить что ты не робот

Выполняет ли "for... of" цикл итерации цикла по порядку массива в JavaScript?

Итерация по массиву с помощью for...in не гарантирует порядок, однако ES6 вводит новую конструкцию for...of.

Мое ограниченное тестирование реализаций for...of указывает, что оно выполняет итерацию по порядку по массиву, но гарантируется ли это свойство?

4b9b3361

Ответ 1

Итерация по массиву с помощью for...in не гарантирует порядок, однако ES6 вводит новую конструкцию for...of.

Мое ограниченное тестирование реализаций for...of указывает, что оно выполняет итерацию по порядку по массиву, но гарантируется ли это свойство?

Да, порядок for-of на массивах гарантируется определение итератора массива: он будет посещать записи в массиве в (включая те, которые не существуют, например, в разреженных массивах, или, возможно, это должны быть те, которые не расположены в разреженных массивах:-)):

Пример Live на Babel REPL, и здесь фрагмент на сайте для тех, кто использует современный браузер:

"use strict";
let a = [];
a[3] = 'd';
a[0] = 'a';
a.foo = "f";
for (let v of a) {
  console.log(v);
}

Ответ 2

Мое ограниченное тестирование реализаций for...of указывает, что он выполняет итерацию по порядку по массиву, но гарантируется ли это свойство?

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

Фактически массивы являются такими итерабельными, и, получая из них итератор, он будет итератором, который дает все элементы массива в том же порядке, в каком они могут быть найдены в массиве. Вы можете прочитать spec для объектов ArrayIterator, они в основном работают как цикл for (var index=0; index<array.length; index++) yield array[index];.

Ответ 3

В соответствии с спецификацией ES6 для для...

for ( LeftHandSideExpression of AssignmentExpression ) Statement

Если LeftHandSideExpression является либо ObjectLiteral, либо ArrayLiteral и если лексическая последовательность токенов согласована Выделение LeftHandSideExpression может быть проанализировано без использования токенов AssignmentPattern как символ цели, тогда следующие правила не применяется. Вместо этого правила ранней ошибки для AssignmentPattern являются б.

В соответствии с этим определением правила грамматики цикл for for.of будет выполняться в лексическом порядке токенов, если это Массив или Объект.. p >

Вот хорошая ссылка блога Дэвида Уолша http://davidwalsh.name/es6-generators, где он объяснил пример того, как цикл for..of работает с использованием итераторов.