Починаючи з ES6 в JavaScript було введено новий оператор for…of, котрий виконує ітерацію (перебір) над об’єктами котрі ітеруються, такими як наприклад:
- Array, String, Map, Set, тощо
- користувацькі об’єкти котрі реалізують протокол ітератора
- Array-подібні об’єкти, такі як arguments
Синтаксис циклу for…of
for (const item of iterable) {
// код для виконання на кожній ітерації ...
}- item – змінна, в яку буде записано поточне значення ітерації. Якщо в тілі циклу планується зміна значення змінної item, для її оголошення слід використовувати ключове слово let (про let в JavaScript), замість const.
- iterable – ітерований об’єкт (Array, String, Map, Set, тощо).
Приклади використання for…of
Використання for…of для ітерації по елементам Array (масив):
let numbers = [1, 2, 3, 4, 5];
for (const number of numbers) {
console.log(number);
}
// OUTPUT: 1, 2, 3, 4, 5Щоб отримати доступ до індексу елементів масиву всередині циклу, можна використати інструкцію for…of в поєднанні з методом масиву entries(). Метод array.entries() – повертає пару [індекс, елемент], на кожній ітерації. Наприклад:
let names = ['Fatima', 'Alex', 'Vinnie'];
for (const [index, name] of names.entries()) {
console.log(`${index}: ${name}`);
}Результат:
0: Fatima
1: Alex
2: VinnieДеструктуризація об’єктів в циклі for…of:
let employees = [
{ name: 'Sam', salary: 1000 },
{ name: 'Alexis', salary: 1500 },
{ name: 'Sarah', salary: 1200 },
];
let sum = 0;
for (const { salary } of employees) {
sum += salary;
}
console.log(`Total salary: ${sum}`);
// OUTPUT: Total salary: 3700Як працює приклад вище:
- employees – це масив об’єктів, де кожен об’єкт має дві властивості: name та salary
- вираз const { salary } of employees використовує деструктуризацію об’єктів, для отримання значення властивості salary з поточного елемента ітерації, та присвоєння його змінній salary
- for…of ітерує масив employees, обчислюючи загальну salary для всіх об’єктів
Ітерація по string
Приклад використання циклу for…of для перебору символів рядка:
let str = 'ABC';
for (const char of str) {
console.log(char);
}
// OUTPUT: A, B, CІтерація по об’єкту Map
Приклад використання for…of для перебору об’єкта Map:
let colors = new Map();
colors.set('red', '#ff0000');
colors.set('green', '#00ff00');
colors.set('blue', '#0000ff');
for (const [key, value] of colors) {
console.log(`${key}: ${value}`);
}Результат:
red: #ff0000
green: #00ff00
blue: #0000ffВідмінність for…of від for…in
- for…of – перебирає елементи будь-якої колекції, яка має властивість [Symbol.iterator]
- for…in – перебирає перелічувані імена властивостей об’єкта
Наступний приклад ілюструє відмінності між for…of та for…in:
const elements = ['A', 'B', 'C'];
elements.customProperty = 'custom';
for (const item of elements) {
console.log(item);
}
// OUTPUT: A, B, C
for (const item in elements) {
console.log(item);
}
// OUTPUT: 0, 1, 2, customPropertyВ цьому прикладі, for…of виконує ітерацію по елементам масиву elements, та повертає результат:
A
B
CТоді як for…in повертає властивості об’єкта масиву elements:
0
1
2
customPropertyВисновок
Цикл for…of слід використовувати коли є потреба перебору елементів ітерованого об’єкта.