Цикл for…in
предназначен для перебора всех перечисляемых свойств объекта в том числе и свойст из прототипа. В переборе участвуют только перечисляемые свойства, то есть те которые были добавлены при написании программы, встроенные из обхода исключаются.
for (let key in obj) {
// тело цикла. Обычно это работа с получаемыми свойствами
}
key
- переменная в которую поочередно записываются имена свойств объекта. Может называться, как угодно, согласно правилам именования. Объявлять переменную можно непосредственно в круглых скобках.
obj
- объект чьи свойства необходимо обойти.
Для того, чтобы получить доступ в цикле до имени свойства обращаемся к key
, чтобы оперировать значением к obj[key]
. В последнем случае key
заключаем именно в квадратные скобки, а не пишем через точку obj.key, чтобы интерпретатор JavaScript понимал, что здесь переменная а не значение.
const skillsForJS = {
skill1: 'HTML',
skill2: 'CSS',
skill3: 'JavaScript',
skill4: 'React',
skill5: 'Node.js'
}
for (let key in skillsForJS) {
console.log(key + ': ' + skillsForJS[key])
}
Цикл for…in
перебирает свойства в произвольном порядке, но условно можно выделить несколько базовых правил.
1. Имена свойств в формате строки будут обходится в порядке присвоения объекту.
const skillsForDevJS = {
HTML: 'Обязательно',
CSS: 'Обязательно',
JavaScript: 'Обязательно',
React: 'Желательно',
VueJS: 'Желательно',
GoogleAds: 'Нет необходимости'
}
for (let key in skillsForDevJS) {
console.log(`${key}: ${skillsForDevJS[key]}`)
}
// Результат
// HTML: Обязательно
// CSS: Обязательно
// JavaScript: Обязательно
// React: Желательно
// VueJS: Желательно
// GoogleAds: Нет необходимости
Результатом будет вывод свойств в порядке перечисления в объекте сверху вниз.
2. Если именами свойств являются числа, тогда обход происходит от меньшего к большему.
const importanceOfSkillsJS = {
4: 'Библиотеки',
3: 'Фреймворки',
7: 'Архитектура',
5: 'Git',
1: 'Нативный JavaScript',
6: 'DOM API',
2: 'HTML и CSS',
}
for (let key in importanceOfSkillsJS) {
console.log(`${key}: ${importanceOfSkillsJS[key]}`)
}
// Результат
// 1: Нативный JavaScript
// 2: HTML и CSS
// 3: Фреймворки
// 4: Библиотеки
// 5: Git
// 6: DOM API
// 7: Архитектура
Если имена свойств это числа и стоит задача вывести их в порядке присвоения объекту, можно перевести числа при записи в объекте в формат строки, а при выводе обратно в числа.
const importanceOfSkillsJS = {
'+4': 'Библиотеки',
'+3': 'Фреймворки',
'+7': 'Архитектура',
'+5': 'Git',
'+1': 'Нативный JavaScript',
'+6': 'DOM API',
'+2': 'HTML и CSS',
}
for (let key in importanceOfSkillsJS) {
console.log(`${+key}: ${importanceOfSkillsJS[key]}`)
}
// Результат
// 4: Библиотеки
// 3: Фреймворки
// 7: Архитектура
// 5: Git
// 1: Нативный JavaScript
// 6: DOM API
// 2: HTML и CSS
Если необходимо добавить или удалить свойство и получить значения уже из обновленного объекта следует производить все действия, до того, как цикл дойдет до этого свойства.
const mySkillsJS = {
'Native JavaScript': 'Да',
React: 'Да',
NodeJS: 'Да',
JQuery: 'Нет',
Angular: 'Нет',
}
mySkillsJS['DOM API'] = 'Да'
mySkillsJS.Git = 'Да'
for (let key in mySkillsJS) {
console.log(`${key}: ${mySkillsJS[key]}`)
}
delete mySkillsJS.React
// Результат
// Native JavaScript: Да
// React: Да
// NodeJS: Да
// JQuery: Нет
// Angular: Нет
// DOM API: Да
// Git: Да
В console видим DOM API: Да и Git: Да, а также React: Да, хотя удалили это свойство, но уже после цикла for…in
Узнать количество свойств в объекте можно несколькими способами, в том числе и с помощью цикла for…in
const popularBooksJS = {
'Хавербеке Марейн': 'Выразительный JavaScript',
'Кайл Симпсон': 'Вы не знаете JS',
'Алексей Васильев': 'JavaScript в примерах и задачах',
'Кэй Хорстман': 'Современный JavaScript для нетерпеливых',
}
let books = 0
for (let key in popularBooksJS) {
books++
}
console.log(books)
Более короткий способ это использовать метод Object.keys()
запросив значение свойства length
Object.keys(popularBooksJS).length
1. for…in
предназначен для обхода перечисляемых свойств объекта.
2. На каждом шаге, цикл for…in
предоставляет доступ до очередного имени свойства и его значения.
3. Порядок перебора четко не определен, поэтому для работы с массивами рекомендуется использовать for…of
, а не for…in