Кратко
СкопированоИнструкция for выполняет цикл обхода перечисляемых свойств итерируемого объекта.
Итерируемый объект можно воспринимать как коллекцию элементов. К итерируемым объектам относятся: Array, String, Map, Set, Typed, а также массивоподобные объекты, такие как arguments и DOM-коллекции.
В каждой итерации цикла выполняются инструкции, которые могут ссылаться на значение текущего элемента коллекции.
Пример
СкопированоВыводим результат деления каждого элемента массива на 2:
const numbers = [28, 16, 32]for (const value of numbers) { console.log(value/2)}// 14// 8// 16
const numbers = [28, 16, 32]
for (const value of numbers) {
console.log(value/2)
}
// 14
// 8
// 16
Выводим форматированное представление для элементов объекта Map:
const skills = new Map()skills.set(1, 'JavaScript')skills.set(2, 'CSS')skills.set(3, 'PHP')for (let value of skills) { console.log(`${value[0]}.`, value[1])}// 1. JavaScript// 2. CSS// 3. PHP
const skills = new Map()
skills.set(1, 'JavaScript')
skills.set(2, 'CSS')
skills.set(3, 'PHP')
for (let value of skills) {
console.log(`${value[0]}.`, value[1])
}
// 1. JavaScript
// 2. CSS
// 3. PHP
Как пишется
СкопированоОбход перечисляемых свойств итерируемого объекта, где на каждой итерации:
- переменная получает значение текущего элемента коллекции;
- выполняется инструкция, имеющая доступ к значению переменной.
for (переменная of итерируемый_объект) инструкция
for (переменная of итерируемый_объект)
инструкция
Обход перечисляемых свойств итерируемого объекта, где на каждой итерации:
- переменная получает значение текущего элемента коллекции;
- выполняется
блок инструкций, имеющих доступ к значениюпеременной.
for (переменная of итерируемый_объект) { блок_инструкций}
for (переменная of итерируемый_объект) {
блок_инструкций
}
Переменная может определяться с использованием let, const и var, или быть объявленной заранее с использованием let и var. Если текущий элемент является объектом или массивом, можно использовать деструктурирующее присваивание:
const skills = new Map()skills.set(1, 'JavaScript')skills.set(2, 'CSS')skills.set(3, 'PHP')for (let [key, value] of skills) { console.log(`${key}.`, value)}// 1. JavaScript// 2. CSS// 3. PHP
const skills = new Map()
skills.set(1, 'JavaScript')
skills.set(2, 'CSS')
skills.set(3, 'PHP')
for (let [key, value] of skills) {
console.log(`${key}.`, value)
}
// 1. JavaScript
// 2. CSS
// 3. PHP
В качестве переменной допускается использовать свойство ранее созданного объекта:
const str = 'Румпельштильцхен'const obj = {}for (obj.value of str) { if (obj.value === 'н') { console.log('Тут есть «н»') }}// Тут есть «н»
const str = 'Румпельштильцхен'
const obj = {}
for (obj.value of str) {
if (obj.value === 'н') {
console.log('Тут есть «н»')
}
}
// Тут есть «н»
Цикл for может быть прерван с использованием инструкции break:
const array = [1, true, null, {}]for (const value of array) { if (value === null) { break } console.log(value)}// 1// true
const array = [1, true, null, {}]
for (const value of array) {
if (value === null) {
break
}
console.log(value)
}
// 1
// true
Инструкция continue позволяет перейти к следующей итерации, минуя оставшиеся инструкции:
const array = [1, true, null, {}]for (const value of array) { if (value === null) { continue } console.log(value)}// 1// true// {}
const array = [1, true, null, {}]
for (const value of array) {
if (value === null) {
continue
}
console.log(value)
}
// 1
// true
// {}
Как понять
СкопированоИнструкция for похожа на for тем, что позволяет итерироваться по коллекции. Однако, в отличие от for, for обходит только значения итерируемых свойств самого объекта.
Сравним поведение:
// Создадим массив и добавим к нему свойство nameconst array = ['Fm', 'H', 'Cm7']array.name = 'массив аккордов'console.log(array)// ['Fm', 'H', 'Cm7', name: 'массив аккордов']// Обойдём массив, используя for...infor (const item in array) { console.log(item);}// 0// 1// 2// name// Обойдём массив, используя for...offor (const value of array) { console.log(value);}// Fm// H// Cm7
// Создадим массив и добавим к нему свойство name
const array = ['Fm', 'H', 'Cm7']
array.name = 'массив аккордов'
console.log(array)
// ['Fm', 'H', 'Cm7', name: 'массив аккордов']
// Обойдём массив, используя for...in
for (const item in array) {
console.log(item);
}
// 0
// 1
// 2
// name
// Обойдём массив, используя for...of
for (const value of array) {
console.log(value);
}
// Fm
// H
// Cm7
Инструкция for позволяет использовать единый способ обхода итерируемых объектов разных типов без необходимости их преобразования в массив.
Подсказки
Скопировано💡 С помощью for можно выполнить обход итератора, созданного вручную:
// Создадим итератор из объекта Stringconst iterator = new String("");iterator[Symbol.iterator] = function () { return { _tick: 0, next: function() { if (this._tick >= 3) { return { done: true } } this._tick++ return { value: `Я вызван ${this._tick} раз`, done: false } }, }}for (const item of iterator) { console.log(item)}// Я вызван 1 раз// Я вызван 2 раз// Я вызван 3 раз
// Создадим итератор из объекта String
const iterator = new String("");
iterator[Symbol.iterator] = function () {
return {
_tick: 0,
next: function() {
if (this._tick >= 3) {
return { done: true }
}
this._tick++
return {
value: `Я вызван ${this._tick} раз`,
done: false
}
},
}
}
for (const item of iterator) {
console.log(item)
}
// Я вызван 1 раз
// Я вызван 2 раз
// Я вызван 3 раз
💡 С помощью for можно выполнить обход функции-генератора:
function* getLangs() { yield 'java'; yield 'js'; yield 'rust';}const generator = getLangs()for (const item of generator) { if (item === 'js') { console.log('JavaScript тут есть!') break }}// JavaScript тут есть!
function* getLangs() {
yield 'java';
yield 'js';
yield 'rust';
}
const generator = getLangs()
for (const item of generator) {
if (item === 'js') {
console.log('JavaScript тут есть!')
break
}
}
// JavaScript тут есть!
💡 Следует отметить, что генератор нельзя использовать дважды, даже если цикл был прерван с использованием break. Попытаемся использовать обход генератора дважды, используя функцию-генератор из предыдущего примера:
const generator = getLangs()for (const item of generator) { if (item === 'js') { console.log('JavaScript тут есть!') break }}// JavaScript тут есть!// Обход ничего не выдастfor (const item of generator) { console.log(item)}
const generator = getLangs()
for (const item of generator) {
if (item === 'js') {
console.log('JavaScript тут есть!')
break
}
}
// JavaScript тут есть!
// Обход ничего не выдаст
for (const item of generator) {
console.log(item)
}