Кратко
Скопированоfor
позволяет пройти в цикле по перечисляемым свойствам объекта, в том числе по свойствам из прототипа.
Перечисляемые свойства – это свойства, которые разработчик добавляет объекту. Встроенные свойства, например length
у массива, не обходятся в цикле for
.
Как пишется
СкопированоСхематично структура для создания цикла выглядит так:
for (переменная in объект) { // действия внутри цикла}
for (переменная in объект) { // действия внутри цикла }
Для цикла необходимо объявить название переменной и указать сам объект, свойства которого нужно обойти. В объявленной переменной будет храниться имя свойства во время итерации:
const cat = { name: 'Борис', color: 'red', age: 8}for (const key in cat) { console.log(`${key} – ${cat[key]}`)}// name – 'Борис',// color – 'red',// age – 8
const cat = { name: 'Борис', color: 'red', age: 8 } for (const key in cat) { console.log(`${key} – ${cat[key]}`) } // name – 'Борис', // color – 'red', // age – 8
Как понять
СкопированоЦикл for
— это хороший способ пройти по всем свойствам объекта, но стоит помнить несколько важных особенностей.
Что такое перечисляемые свойства
СкопированоПеречисляемые свойства объекта – это свойства, которые явно помечены такими. Сказать свойству, что оно перечисляемое, можно через специальный метод define
. Но для простоты все свойства, которые добавляются к объекту, являются перечисляемыми по умолчанию. Встроенные свойства не перечисляется. Например, метод index
у объекта String
или метод to
у любого объекта не участвуют в цикле for
.
В цикле будут перечислены не только собственные свойства объекта, но и все перечисляемые свойства из прототипа объекта и прототипа прототипа и так далее:
const a = { a: 1 }const b = { b: 2 }const c = { c: 3 }Object.setPrototypeOf(b, a)Object.setPrototypeOf(c, b)for (const key in c) { console.log(key)}// Выведет: c, b, a
const a = { a: 1 } const b = { b: 2 } const c = { c: 3 } Object.setPrototypeOf(b, a) Object.setPrototypeOf(c, b) for (const key in c) { console.log(key) } // Выведет: c, b, a
Порядок перечисления
СкопированоВ стандарте языка нет описания того, как свойства должны перечисляться, потому порядок будет зависеть от реализации в конкретном движке браузера. Но есть базовые правила, которое можно встретить во всех браузерах:
1️⃣ Строковые имена свойств будут перечисляться в порядке их присвоения к объекту:
const developer = { name: 'Ваня', language: 'JavaScript', company: 'Google'}for (const key in developer) { console.log(key)}// name// language// company
const developer = { name: 'Ваня', language: 'JavaScript', company: 'Google' } for (const key in developer) { console.log(key) } // name // language // company
2️⃣ Числовые свойства будут перечисляться в отсортированном порядке по возрастанию:
const booksById = { 341: { name: 'Harry Potter' }, 144: { name: 'Flowers for Algernon' }, 202: { name: 'Lord of the Rings' }}for (const key in booksById) { console.log(key)}// 144// 202// 341
const booksById = { 341: { name: 'Harry Potter' }, 144: { name: 'Flowers for Algernon' }, 202: { name: 'Lord of the Rings' } } for (const key in booksById) { console.log(key) } // 144 // 202 // 341
Изменение объекта во время перебора
СкопированоЕсли во время выполнения for
добавлять свойства в объект, то нет гарантии, что это свойство попадёт в цикл. Свойство, удалённое из объекта до того, как до него дошёл цикл, не будет участвовать в итерации.