
Привет,
В JavaScript существует множество способов перебора массивов и объектов, поэтому иногда возникает путаница между ними 😕
Начнем со сравнения
Обзор синтаксиса
Циклические конструкции for и for/in дают вам доступ к индексу в массиве, а не к фактическому элементу.
const arr = ['a', 'b', 'c'];// with for and for/in loop you can get element using arr[i] for (let i = 0; i < arr.length; ++i) { console.log(arr[i]); } for (let i in arr) { console.log(arr[i]); }
forEach() и for/of вы получаете доступ к самому элементу массива.
*С forEach() можно получить доступ к индексу массива i, с for/of нельзя.
const arr = ['a', 'b', 'c'];// with for and for/of loop you can get element direclty arr.forEach((item, i) => console.log(item) ); for (const item of arr) { console.log(arr[i]); }
Пустой/неопределенный элемент
Массивы JavaScript допускают пустые элементы.
forEach() и for/in пропускают пустые элементы массива, for и for/of — нет.
const arr = ['a',, 'c']; or const arr = ['a', undefined,'c']for (let i = 0; i < arr.length; ++i) { console.log(arr[i]); } // Prints "a, undefined, c" arr.forEach(v => console.log(v)); // Prints "a, c" for (let i in arr) { console.log(arr[i]); } // Prints "a, c" for (const v of arr) { console.log(v); } // Prints "a, undefined, c"
Async/Await и генераторы
Еще один пограничный случай с forEach() заключается в том, что он не совсем правильно работает с async/await или генераторами. Если ваш обратный вызов forEach() является синхронным, это не имеет значения, но вы не можете использовать await в обратном вызове forEach().
— — — — — — — — — — — — — — — — — — — — — — — — — — — -
Вопрос для вас
Как мы можем получить индекс в цикле for/of? сначала подумай…
.
.
.
Вот ответ
Чтобы получить доступ к текущему индексу массива в цикле for/of, вы можете использовать функцию Array#entries().
for (const [i, v] of arr.entries()) {
console.log(i, v); // Prints "0 a", "1 b", "2 c"
}

Спасибо за чтение. Надеюсь, это поможет.