1 added
1 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>5 авг 2025</li>
2
<ul><li>5 авг 2025</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Простое введение в объекты как тип данных в JavaScript: показываем, как создавать объекты, добавлять свойства и методы.</p>
4
</ul><p>Простое введение в объекты как тип данных в JavaScript: показываем, как создавать объекты, добавлять свойства и методы.</p>
5
<p>Иллюстрация: Polina Vari для Skillbox Media</p>
5
<p>Иллюстрация: Polina Vari для Skillbox Media</p>
6
<p>Автор статей о программировании. 14 лет в IT. Умеет рассказывать о технологиях простыми словами. Автор спецпроекта Advertising for Social Change.</p>
6
<p>Автор статей о программировании. 14 лет в IT. Умеет рассказывать о технологиях простыми словами. Автор спецпроекта Advertising for Social Change.</p>
7
<p>В JavaScript объекты помогают описывать всё, что состоит из нескольких характеристик. Пользователь с именем, возрастом и email - это объект. Товар с ценой, описанием и наличием на складе - тоже.</p>
7
<p>В JavaScript объекты помогают описывать всё, что состоит из нескольких характеристик. Пользователь с именем, возрастом и email - это объект. Товар с ценой, описанием и наличием на складе - тоже.</p>
8
<p>Объекты позволяют хранить связанные данные в одной структуре и обращаться к ним по имени. Благодаря этому код становится понятнее, его проще поддерживать и передавать данные между частями программы. Без объектов в JavaScript не обходится почти ни один проект. В этой статье разберём, как они устроены, как их создавать, читать и изменять.</p>
8
<p>Объекты позволяют хранить связанные данные в одной структуре и обращаться к ним по имени. Благодаря этому код становится понятнее, его проще поддерживать и передавать данные между частями программы. Без объектов в JavaScript не обходится почти ни один проект. В этой статье разберём, как они устроены, как их создавать, читать и изменять.</p>
9
<p><strong>Содержание</strong></p>
9
<p><strong>Содержание</strong></p>
10
<ul><li><a>Что такое объект</a></li>
10
<ul><li><a>Что такое объект</a></li>
11
<li><a>Как его создать</a></li>
11
<li><a>Как его создать</a></li>
12
<li><a>Как получить данные из объекта</a></li>
12
<li><a>Как получить данные из объекта</a></li>
13
<li><a>Изменение объектов</a></li>
13
<li><a>Изменение объектов</a></li>
14
<li><a>Защита объектов от изменений</a></li>
14
<li><a>Защита объектов от изменений</a></li>
15
<li><a>Вложенные объекты</a></li>
15
<li><a>Вложенные объекты</a></li>
16
<li><a>Типичные ошибки и как их избежать</a></li>
16
<li><a>Типичные ошибки и как их избежать</a></li>
17
<li><a>Советы по работе с объектами</a></li>
17
<li><a>Советы по работе с объектами</a></li>
18
</ul><p>Объект в JavaScript - это набор пар "ключ: значение". Ключ (или свойство) задаёт название характеристики, а значение может быть строкой, числом, логическим значением, массивом, другим объектом или функцией.</p>
18
</ul><p>Объект в JavaScript - это набор пар "ключ: значение". Ключ (или свойство) задаёт название характеристики, а значение может быть строкой, числом, логическим значением, массивом, другим объектом или функцией.</p>
19
<p>Объекты используют, например:</p>
19
<p>Объекты используют, например:</p>
20
<ul><li>Когда нужно объединить в одной структуре несколько характеристик: имя, возраст и статус пользователя и прочие.</li>
20
<ul><li>Когда нужно объединить в одной структуре несколько характеристик: имя, возраст и статус пользователя и прочие.</li>
21
<li>Когда важно передать в функцию не длинный список параметров, а один структурированный аргумент.</li>
21
<li>Когда важно передать в функцию не длинный список параметров, а один структурированный аргумент.</li>
22
<li>При работе с API: серверы часто отправляют данные в виде объектов - особенно в формате JSON.</li>
22
<li>При работе с API: серверы часто отправляют данные в виде объектов - особенно в формате JSON.</li>
23
<li>Когда данные и функции, которые с ними работают, нужно держать вместе (например, в методах объекта).</li>
23
<li>Когда данные и функции, которые с ними работают, нужно держать вместе (например, в методах объекта).</li>
24
</ul><p>Посмотрим, как выглядит объект в коде:</p>
24
</ul><p>Посмотрим, как выглядит объект в коде:</p>
25
const user = { name: "Анна", age: 28, email: "anna@example.com", isActive: true };<p>В этом примере:</p>
25
const user = { name: "Анна", age: 28, email: "anna@example.com", isActive: true };<p>В этом примере:</p>
26
<ul><li>user - переменная, содержащая объект;</li>
26
<ul><li>user - переменная, содержащая объект;</li>
27
<li>name, age, email, isActive - свойства объекта;</li>
27
<li>name, age, email, isActive - свойства объекта;</li>
28
<li>каждое свойство имеет своё значение: строку, число или логическое значение (true или false).</li>
28
<li>каждое свойство имеет своё значение: строку, число или логическое значение (true или false).</li>
29
</ul><p>Теперь все связанные данные хранятся вместе - и их легко получить, изменить или передать туда, куда нужно.</p>
29
</ul><p>Теперь все связанные данные хранятся вместе - и их легко получить, изменить или передать туда, куда нужно.</p>
30
<p>В JavaScript есть простой способ создать объект - через литерал. Это специальная форма записи, где объект описывается с помощью фигурных скобок {}.</p>
30
<p>В JavaScript есть простой способ создать объект - через литерал. Это специальная форма записи, где объект описывается с помощью фигурных скобок {}.</p>
31
<p>Пример:</p>
31
<p>Пример:</p>
32
const user = { name: "Анна", age: 25, isStudent: true };<p>Здесь мы создаём объект и задаём в нём три свойства:</p>
32
const user = { name: "Анна", age: 25, isStudent: true };<p>Здесь мы создаём объект и задаём в нём три свойства:</p>
33
<ul><li>name - имя пользователя,</li>
33
<ul><li>name - имя пользователя,</li>
34
<li>age - возраст,</li>
34
<li>age - возраст,</li>
35
<li>isStudent - учится ли он сейчас.</li>
35
<li>isStudent - учится ли он сейчас.</li>
36
</ul><p>Каждое свойство записывается в формате "ключ: значение". Ключ (слева) - это название свойства, значение (справа) - что именно хранится. Значения могут быть любого типа: число, строка, логическое значение, массив, другой объект и так далее.</p>
36
</ul><p>Каждое свойство записывается в формате "ключ: значение". Ключ (слева) - это название свойства, значение (справа) - что именно хранится. Значения могут быть любого типа: число, строка, логическое значение, массив, другой объект и так далее.</p>
37
<p>В JavaScript можно создать объект с помощью специального встроенного конструктора - Object. Для этого используют ключевое слово new:</p>
37
<p>В JavaScript можно создать объект с помощью специального встроенного конструктора - Object. Для этого используют ключевое слово new:</p>
38
const user = new Object();<p>Это создаёт пустой объект, в котором пока нет никаких свойств.</p>
38
const user = new Object();<p>Это создаёт пустой объект, в котором пока нет никаких свойств.</p>
39
<p>Дальше вы можете добавить в него нужные данные:</p>
39
<p>Дальше вы можете добавить в него нужные данные:</p>
40
user.name = "Анна"; user.age = 25; user.isStudent = true;<p>Теперь объект user выглядит так же, как если бы вы создали его через литерал.</p>
40
user.name = "Анна"; user.age = 25; user.isStudent = true;<p>Теперь объект user выглядит так же, как если бы вы создали его через литерал.</p>
41
<p><strong>Чем конструктор отличается от литерала</strong></p>
41
<p><strong>Чем конструктор отличается от литерала</strong></p>
42
<p>Литерал - это краткая форма, при которой объект сразу заполняется внутри фигурных скобок.</p>
42
<p>Литерал - это краткая форма, при которой объект сразу заполняется внутри фигурных скобок.</p>
43
<p>Конструктор new Object() - это более "формальный" способ, похожий на то, как создаются объекты в других языках программирования.</p>
43
<p>Конструктор new Object() - это более "формальный" способ, похожий на то, как создаются объекты в других языках программирования.</p>
44
<p>Иногда данных бывает много и хочется организовать их не просто в один объект, а в набор одинаковых по структуре объектов. В таких случаях удобно использовать массив объектов.</p>
44
<p>Иногда данных бывает много и хочется организовать их не просто в один объект, а в набор одинаковых по структуре объектов. В таких случаях удобно использовать массив объектов.</p>
45
<p><strong>Массив объектов</strong>- структура, где каждый элемент является полноценным объектом со своими свойствами.</p>
45
<p><strong>Массив объектов</strong>- структура, где каждый элемент является полноценным объектом со своими свойствами.</p>
46
-
<p>Пример - список студентов:</p>
46
+
<p>Пример - с��исок студентов:</p>
47
const users = [ { name: "Алина", age: 19 }, { name: "Марк", age: 20 }, { name: "Юля", age: 18 } ];<p>Каждый элемент - это отдельный объект, и у всех у них одинаковая "форма" (одни и те же поля: name, age).</p>
47
const users = [ { name: "Алина", age: 19 }, { name: "Марк", age: 20 }, { name: "Юля", age: 18 } ];<p>Каждый элемент - это отдельный объект, и у всех у них одинаковая "форма" (одни и те же поля: name, age).</p>
48
<p>Для добавления нового объекта в массив используйте метод .push():</p>
48
<p>Для добавления нового объекта в массив используйте метод .push():</p>
49
users.push({ name: "Иван", age: 21 });<p>Теперь в массиве четыре студента.</p>
49
users.push({ name: "Иван", age: 21 });<p>Теперь в массиве четыре студента.</p>
50
<p>После того как объект создан, следующий шаг - доступ к его данным. В JavaScript к свойствам объекта можно обратиться двумя способами: через точку и через квадратные скобки.</p>
50
<p>После того как объект создан, следующий шаг - доступ к его данным. В JavaScript к свойствам объекта можно обратиться двумя способами: через точку и через квадратные скобки.</p>
51
<p>Это самый распространённый и простой способ. Вы пишете имя объекта, ставите точку и указываете название свойства:</p>
51
<p>Это самый распространённый и простой способ. Вы пишете имя объекта, ставите точку и указываете название свойства:</p>
52
const user = { name: "Анна", age: 25 }; console.log(user.name); // "Анна" console.log(user.age); // 25<p>Этот способ работает, если имя свойства - обычное слово без пробелов и специальных символов.</p>
52
const user = { name: "Анна", age: 25 }; console.log(user.name); // "Анна" console.log(user.age); // 25<p>Этот способ работает, если имя свойства - обычное слово без пробелов и специальных символов.</p>
53
<p>Квадратные скобки нужны, если:</p>
53
<p>Квадратные скобки нужны, если:</p>
54
<ul><li>имя свойства содержит пробелы или спецсимволы,</li>
54
<ul><li>имя свойства содержит пробелы или спецсимволы,</li>
55
<li>имя свойства хранится в переменной.</li>
55
<li>имя свойства хранится в переменной.</li>
56
</ul>const user = { name: "Анна Владимировна", "user role": "admin" }; console.log(user["name"]); // "Анна Владимировна" console.log(user["user role"]); // "admin"<p>Если имя свойства хранится в переменной:</p>
56
</ul>const user = { name: "Анна Владимировна", "user role": "admin" }; console.log(user["name"]); // "Анна Владимировна" console.log(user["user role"]); // "admin"<p>Если имя свойства хранится в переменной:</p>
57
const key = "name"; console.log(user[key]); // "Анна Владимировна"<p><strong>Важно:</strong>в квадратных скобках имя свойства должно быть в кавычках, если это текст, или без кавычек, если используется переменная.</p>
57
const key = "name"; console.log(user[key]); // "Анна Владимировна"<p><strong>Важно:</strong>в квадратных скобках имя свойства должно быть в кавычках, если это текст, или без кавычек, если используется переменная.</p>
58
<p>Иногда вам нужно не просто получить одно свойство из объекта, а пройтись по всем свойствам сразу - например, чтобы вывести их на экран, подсчитать, изменить или проверить. Это называется перебором свойств объекта.</p>
58
<p>Иногда вам нужно не просто получить одно свойство из объекта, а пройтись по всем свойствам сразу - например, чтобы вывести их на экран, подсчитать, изменить или проверить. Это называется перебором свойств объекта.</p>
59
<p>Цикл for...in перебирает все ключи (имена свойств) объекта по одному. Для каждого свойства внутри цикла можно получить его значение, используя квадратные скобки.</p>
59
<p>Цикл for...in перебирает все ключи (имена свойств) объекта по одному. Для каждого свойства внутри цикла можно получить его значение, используя квадратные скобки.</p>
60
const user = { name: "Алина", age: 19 }; for (let key in user) { console.log(key); // выводит ключ: name, age console.log(user[key]); // выводит значение: "Алина", 19 }<p>Здесь используется скобочная запись user[key], потому что key - это переменная.</p>
60
const user = { name: "Алина", age: 19 }; for (let key in user) { console.log(key); // выводит ключ: name, age console.log(user[key]); // выводит значение: "Алина", 19 }<p>Здесь используется скобочная запись user[key], потому что key - это переменная.</p>
61
<p>Метод Object.keys() возвращает массив всех ключей объекта. Этот массив можно обойти любым методом массивов, например forEach или map.</p>
61
<p>Метод Object.keys() возвращает массив всех ключей объекта. Этот массив можно обойти любым методом массивов, например forEach или map.</p>
62
const user = { name: "Алина", age: 19 }; const keys = Object.keys(user); keys.forEach(key => { console.log(key); // "name", "age" console.log(user[key]); // "Алина", 19 });<p>Метод Object.values() возвращает массив всех значений свойств объекта.</p>
62
const user = { name: "Алина", age: 19 }; const keys = Object.keys(user); keys.forEach(key => { console.log(key); // "name", "age" console.log(user[key]); // "Алина", 19 });<p>Метод Object.values() возвращает массив всех значений свойств объекта.</p>
63
const user = { name: "Алина", age: 19 }; const values = Object.values(user); console.log(values); // ["Алина", 19]<p>Метод Object.entries() возвращает массив пар [ключ: значение]. Это удобно, если нужны и ключи, и значения одновременно.</p>
63
const user = { name: "Алина", age: 19 }; const values = Object.values(user); console.log(values); // ["Алина", 19]<p>Метод Object.entries() возвращает массив пар [ключ: значение]. Это удобно, если нужны и ключи, и значения одновременно.</p>
64
const user = { name: "Алина", age: 19 }; for (const [key, value] of Object.entries(user)) { console.log(`${key}: ${value}`); } // name: Алина // age: 19<p>Объекты в JavaScript очень гибкие - вы можете не только читать их свойства, но и в любой момент менять, добавлять, удалять и проверять, есть ли в объекте нужные данные. Все эти действия выполняются буквально в одну строчку.</p>
64
const user = { name: "Алина", age: 19 }; for (const [key, value] of Object.entries(user)) { console.log(`${key}: ${value}`); } // name: Алина // age: 19<p>Объекты в JavaScript очень гибкие - вы можете не только читать их свойства, но и в любой момент менять, добавлять, удалять и проверять, есть ли в объекте нужные данные. Все эти действия выполняются буквально в одну строчку.</p>
65
<p>Чтобы изменить свойство объекта, просто присвойте ему новое значение:</p>
65
<p>Чтобы изменить свойство объекта, просто присвойте ему новое значение:</p>
66
const user = { name: "Анна", age: 25 }; user.age = 26; // меняем возраст user.name = "Мария"; // меняем имя<p>Чтобы добавить новое свойство в объект, укажите его имя и присвойте значение:</p>
66
const user = { name: "Анна", age: 25 }; user.age = 26; // меняем возраст user.name = "Мария"; // меняем имя<p>Чтобы добавить новое свойство в объект, укажите его имя и присвойте значение:</p>
67
user.city = "Москва"; // Добавляем новое свойство "city"<p>Чтобы полностью удалить свойство, используйте оператор delete:</p>
67
user.city = "Москва"; // Добавляем новое свойство "city"<p>Чтобы полностью удалить свойство, используйте оператор delete:</p>
68
delete user.age; // Удаляем свойство "age"<p>Чтобы узнать, есть ли в объекте какое-то свойство, можно использовать оператор in или метод hasOwnProperty().</p>
68
delete user.age; // Удаляем свойство "age"<p>Чтобы узнать, есть ли в объекте какое-то свойство, можно использовать оператор in или метод hasOwnProperty().</p>
69
<p>Проверяет, существует ли свойство с таким именем в самом объекте или в его прототипе.</p>
69
<p>Проверяет, существует ли свойство с таким именем в самом объекте или в его прототипе.</p>
70
"name" in user; // true (свойство "name" есть) "age" in user; // false (если мы его удалили)<p>Проверяет только собственные свойства объекта,<strong>не учитывая прототип</strong>.</p>
70
"name" in user; // true (свойство "name" есть) "age" in user; // false (если мы его удалили)<p>Проверяет только собственные свойства объекта,<strong>не учитывая прототип</strong>.</p>
71
user.hasOwnProperty("city"); // true<p>Объекты в JavaScript могут хранить не только данные, но и функции - методы, которые работают с этими данными.</p>
71
user.hasOwnProperty("city"); // true<p>Объекты в JavaScript могут хранить не только данные, но и функции - методы, которые работают с этими данными.</p>
72
<p>В примере ниже объект объект student хранит данные о студенте и умеет печатать их в консоль.</p>
72
<p>В примере ниже объект объект student хранит данные о студенте и умеет печатать их в консоль.</p>
73
const student = { name: "Алина", age: 19, group: "БИ-01", printInfo() { console.log(`Студент: ${this.name}, возраст: ${this.age}, группа: ${this.group}`); } }; student.printInfo(); // Студент: Алина, возраст: 19, группа: БИ-01<p><strong>Что происходит:</strong></p>
73
const student = { name: "Алина", age: 19, group: "БИ-01", printInfo() { console.log(`Студент: ${this.name}, возраст: ${this.age}, группа: ${this.group}`); } }; student.printInfo(); // Студент: Алина, возраст: 19, группа: БИ-01<p><strong>Что происходит:</strong></p>
74
<p>1. Объект student хранит три свойства: name, age и group.</p>
74
<p>1. Объект student хранит три свойства: name, age и group.</p>
75
<p>2. Внутри него мы добавили метод printInfo. Это функция, которая может обращаться к свойствам объекта.</p>
75
<p>2. Внутри него мы добавили метод printInfo. Это функция, которая может обращаться к свойствам объекта.</p>
76
<p>3. Ключевое слово this в методе указывает на сам объект student.</p>
76
<p>3. Ключевое слово this в методе указывает на сам объект student.</p>
77
<ul><li>this.name берёт значение свойства name ("Алина").</li>
77
<ul><li>this.name берёт значение свойства name ("Алина").</li>
78
<li>this.age берёт возраст (19).</li>
78
<li>this.age берёт возраст (19).</li>
79
<li>this.group берёт группу ("БИ-01").</li>
79
<li>this.group берёт группу ("БИ-01").</li>
80
</ul><p>4. Метод выводит все эти данные в консоль в удобном виде.</p>
80
</ul><p>4. Метод выводит все эти данные в консоль в удобном виде.</p>
81
<p>В JavaScript переменные можно создавать с помощью let или const. Но важно понимать: эти ключевые слова управляют только тем, можно ли поменять саму переменную на что-то другое. Они не делают сам объект внутри переменной неизменяемым.</p>
81
<p>В JavaScript переменные можно создавать с помощью let или const. Но важно понимать: эти ключевые слова управляют только тем, можно ли поменять саму переменную на что-то другое. Они не делают сам объект внутри переменной неизменяемым.</p>
82
<p>Если объявить переменную с let, вы сможете в любой момент присвоить ей другой объект.</p>
82
<p>Если объявить переменную с let, вы сможете в любой момент присвоить ей другой объект.</p>
83
let user = { name: "Анна" }; // создаём объект user = { name: "Иван" }; // заменяем его на новый<p>Здесь всё работает, потому что let разрешает изменять значение переменной.</p>
83
let user = { name: "Анна" }; // создаём объект user = { name: "Иван" }; // заменяем его на новый<p>Здесь всё работает, потому что let разрешает изменять значение переменной.</p>
84
<p>Если вы использовали const, вы не сможете присвоить переменной другой объект. Но при этом можно изменять свойства объекта, который уже хранится в переменной.</p>
84
<p>Если вы использовали const, вы не сможете присвоить переменной другой объект. Но при этом можно изменять свойства объекта, который уже хранится в переменной.</p>
85
const user = { name: "Анна" }; // Изменяем свойство объекта -- это можно user.name = "Иван"; // Пытаемся заменить объект на новый -- это ошибка user = { name: "Пётр" }; // Ошибка: нельзя переназначить переменную<p><strong>Почему так</strong>: const блокирует только саму переменную - она всегда ссылается на один и тот же объект. Но свойства этого объекта можно менять.</p>
85
const user = { name: "Анна" }; // Изменяем свойство объекта -- это можно user.name = "Иван"; // Пытаемся заменить объект на новый -- это ошибка user = { name: "Пётр" }; // Ошибка: нельзя переназначить переменную<p><strong>Почему так</strong>: const блокирует только саму переменную - она всегда ссылается на один и тот же объект. Но свойства этого объекта можно менять.</p>
86
<p>Объекты в JavaScript - ссылочные типы: при присваивании копируется не сам объект, а ссылка на него. Поэтому даже при использовании const можно изменять содержимое объекта. Это означает, что при присваивании объекта в новую переменную копируется не сам объект, а ссылка на него - то есть указание на одну и ту же область памяти.</p>
86
<p>Объекты в JavaScript - ссылочные типы: при присваивании копируется не сам объект, а ссылка на него. Поэтому даже при использовании const можно изменять содержимое объекта. Это означает, что при присваивании объекта в новую переменную копируется не сам объект, а ссылка на него - то есть указание на одну и ту же область памяти.</p>
87
<p>Это как Google-документ: когда вы делитесь ссылкой с коллегами, то все, у кого есть эта ссылка, работают с одним и тем же документом. Если кто-то внесёт правки, их увидят все.</p>
87
<p>Это как Google-документ: когда вы делитесь ссылкой с коллегами, то все, у кого есть эта ссылка, работают с одним и тем же документом. Если кто-то внесёт правки, их увидят все.</p>
88
<p>Поэтому, даже если объект объявлен через const, его содержимое всё равно можно изменить, потому что const защищает только саму ссылку, но не данные по этой ссылке.</p>
88
<p>Поэтому, даже если объект объявлен через const, его содержимое всё равно можно изменить, потому что const защищает только саму ссылку, но не данные по этой ссылке.</p>
89
const user1 = { name: "Анна" }; const user2 = user1; user2.name = "Ольга"; console.log(user1.name); // "Ольга"<p>Здесь user1 и user2 - это переменные, хранящие одну и ту же ссылку. Когда мы меняем user2.name, мы по сути меняем общий объект, доступный и через user1.</p>
89
const user1 = { name: "Анна" }; const user2 = user1; user2.name = "Ольга"; console.log(user1.name); // "Ольга"<p>Здесь user1 и user2 - это переменные, хранящие одну и ту же ссылку. Когда мы меняем user2.name, мы по сути меняем общий объект, доступный и через user1.</p>
90
<p>Чтобы запретить изменения самого объекта, используйте методы Object.freeze() или Object.seal().</p>
90
<p>Чтобы запретить изменения самого объекта, используйте методы Object.freeze() или Object.seal().</p>
91
<p><strong>Object.seal()</strong>как бы "запечатывает" объект: нельзя добавлять или удалять свойства, но можно менять существующие значения.</p>
91
<p><strong>Object.seal()</strong>как бы "запечатывает" объект: нельзя добавлять или удалять свойства, но можно менять существующие значения.</p>
92
const user = { name: "Анна", age: 25 }; Object.seal(user); user.age = 26; // Можно изменить существующее свойство user.city = "Москва"; // Не добавится -- новые свойства запрещены delete user.name; // Не удалится -- удаление свойств запрещено console.log(user); // { name: "Анна", age: 26 }<p><strong>Object.freeze()</strong><strong></strong>полностью замораживает объект: нельзя менять, добавлять или удалять свойства.</p>
92
const user = { name: "Анна", age: 25 }; Object.seal(user); user.age = 26; // Можно изменить существующее свойство user.city = "Москва"; // Не добавится -- новые свойства запрещены delete user.name; // Не удалится -- удаление свойств запрещено console.log(user); // { name: "Анна", age: 26 }<p><strong>Object.freeze()</strong><strong></strong>полностью замораживает объект: нельзя менять, добавлять или удалять свойства.</p>
93
const settings = { theme: "dark", language: "ru" }; Object.freeze(settings); settings.theme = "light"; // Не изменится settings.mobile = true; // Не добавится delete settings.language; // Не удалится console.log(settings); // { theme: "dark", language: "ru" }<p>А ещё -<strong></strong>JavaScript позволяет проверить, защищён ли объект:</p>
93
const settings = { theme: "dark", language: "ru" }; Object.freeze(settings); settings.theme = "light"; // Не изменится settings.mobile = true; // Не добавится delete settings.language; // Не удалится console.log(settings); // { theme: "dark", language: "ru" }<p>А ещё -<strong></strong>JavaScript позволяет проверить, защищён ли объект:</p>
94
<ul><li>Object.isSealed(obj) - вернёт true, если объект запечатан.</li>
94
<ul><li>Object.isSealed(obj) - вернёт true, если объект запечатан.</li>
95
<li>Object.isFrozen(obj) - вернёт true, если объект заморожен.</li>
95
<li>Object.isFrozen(obj) - вернёт true, если объект заморожен.</li>
96
</ul><p>В JavaScript объект может хранить внутри себя другие объекты. Это позволяет строить более сложные структуры и связывать их между собой. Такой подход помогает избежать повторов одинаковых данных. Если изменить что-то в одном месте, изменения сразу будут видны везде, где используется этот объект.</p>
96
</ul><p>В JavaScript объект может хранить внутри себя другие объекты. Это позволяет строить более сложные структуры и связывать их между собой. Такой подход помогает избежать повторов одинаковых данных. Если изменить что-то в одном месте, изменения сразу будут видны везде, где используется этот объект.</p>
97
<p>Пример: каждый студент учится в группе. Вместо того чтобы писать данные о группе у каждого студента заново, можно создать отдельный объект для группы и сослаться на него:</p>
97
<p>Пример: каждый студент учится в группе. Вместо того чтобы писать данные о группе у каждого студента заново, можно создать отдельный объект для группы и сослаться на него:</p>
98
const group = { name: "БИ-01", faculty: "Бизнес-информатика", course: 2 }; const student = { name: "Алина", age: 19, group: group // ссылка на объект группы };<p>Теперь свойство group в объекте student указывает на отдельный объект group.</p>
98
const group = { name: "БИ-01", faculty: "Бизнес-информатика", course: 2 }; const student = { name: "Алина", age: 19, group: group // ссылка на объект группы };<p>Теперь свойство group в объекте student указывает на отдельный объект group.</p>
99
<p>Если данные о группе нужны только в одном объекте, их можно сразу вставить в свойство group и не создавать отдельную переменную:</p>
99
<p>Если данные о группе нужны только в одном объекте, их можно сразу вставить в свойство group и не создавать отдельную переменную:</p>
100
const student = { name: "Алина", age: 19, group: { name: "БИ-01", faculty: "Бизнес-информатика", course: 2 } };<p>Чтобы обратиться к свойствам вложенного объекта, используйте точку для каждого уровня:</p>
100
const student = { name: "Алина", age: 19, group: { name: "БИ-01", faculty: "Бизнес-информатика", course: 2 } };<p>Чтобы обратиться к свойствам вложенного объекта, используйте точку для каждого уровня:</p>
101
console.log(student.group.name); // "БИ-01" console.log(student.group.faculty); // "Бизнес-информатика"<p>Вы можете добавить второго студента и обновить курс - и он автоматически изменится для всех студентов, потому что они ссылаются на один и тот же объект group.</p>
101
console.log(student.group.name); // "БИ-01" console.log(student.group.faculty); // "Бизнес-информатика"<p>Вы можете добавить второго студента и обновить курс - и он автоматически изменится для всех студентов, потому что они ссылаются на один и тот же объект group.</p>
102
const student2 = { name: "Максим", group: group }; group.course = 3; console.log(student.group.course); // 3 console.log(student2.group.course); // 3<p>Почему это полезно:</p>
102
const student2 = { name: "Максим", group: group }; group.course = 3; console.log(student.group.course); // 3 console.log(student2.group.course); // 3<p>Почему это полезно:</p>
103
<ul><li>Можно не повторять одни и те же данные в каждом объекте.</li>
103
<ul><li>Можно не повторять одни и те же данные в каждом объекте.</li>
104
<li>Достаточно изменить данные в одном месте, и они обновятся везде.</li>
104
<li>Достаточно изменить данные в одном месте, и они обновятся везде.</li>
105
<li>Это свойство помогает строить сложные структуры: студент → группа → факультет → университет.</li>
105
<li>Это свойство помогает строить сложные структуры: студент → группа → факультет → университет.</li>
106
</ul><p>Новичку легко запутаться в объектах JS. Особенно часто ошибки возникают при получении данных, копировании объектов или работе с вложенными свойствами. Ниже - самые распространённые ошибки и способы их избежать.</p>
106
</ul><p>Новичку легко запутаться в объектах JS. Особенно часто ошибки возникают при получении данных, копировании объектов или работе с вложенными свойствами. Ниже - самые распространённые ошибки и способы их избежать.</p>
107
const user = { name: "Анна" }; console.log(user.age); // undefined<p><strong>Почему это происходит</strong>: свойства age в объекте нет. JavaScript не выдаёт ошибку, а просто возвращает undefined. Это может сбить с толку и поломать логику программы.</p>
107
const user = { name: "Анна" }; console.log(user.age); // undefined<p><strong>Почему это происходит</strong>: свойства age в объекте нет. JavaScript не выдаёт ошибку, а просто возвращает undefined. Это может сбить с толку и поломать логику программы.</p>
108
<p><strong>Правильный вариант</strong>: проверьте, есть ли такое свойство, перед тем, как его использовать.</p>
108
<p><strong>Правильный вариант</strong>: проверьте, есть ли такое свойство, перед тем, как его использовать.</p>
109
if ("age" in user) { console.log(user.age); }const key = "name"; console.log(user.key); // undefined<p><strong>Почему это происходит</strong>: user.key ищет свойство с именем "key", а не берёт значение из переменной key.</p>
109
if ("age" in user) { console.log(user.age); }const key = "name"; console.log(user.key); // undefined<p><strong>Почему это происходит</strong>: user.key ищет свойство с именем "key", а не берёт значение из переменной key.</p>
110
<p><strong>Правильный вариант</strong>: если имя свойства хранится в переменной, используйте квадратные скобки.</p>
110
<p><strong>Правильный вариант</strong>: если имя свойства хранится в переменной, используйте квадратные скобки.</p>
111
console.log(user[key]); // "Анна"const user1 = { name: "Анна" }; const user2 = user1; user2.name = "Иван"; console.log(user1.name); // "Иван"<p><strong>Почему это происходит</strong>: user1 и user2 указывают на один и тот же объект. Изменение через user2 затрагивает и user1.</p>
111
console.log(user[key]); // "Анна"const user1 = { name: "Анна" }; const user2 = user1; user2.name = "Иван"; console.log(user1.name); // "Иван"<p><strong>Почему это происходит</strong>: user1 и user2 указывают на один и тот же объект. Изменение через user2 затрагивает и user1.</p>
112
<p><strong>Правильный вариант</strong>: создайте новую копию объекта.</p>
112
<p><strong>Правильный вариант</strong>: создайте новую копию объекта.</p>
113
const user2 = { ...user1 };const student = {}; console.log(student.group.name); // TypeError: Cannot read property 'name' of undefined<p><strong>Почему это происходит</strong>: student.group не существует, и JavaScript не может найти у него свойство name.</p>
113
const user2 = { ...user1 };const student = {}; console.log(student.group.name); // TypeError: Cannot read property 'name' of undefined<p><strong>Почему это происходит</strong>: student.group не существует, и JavaScript не может найти у него свойство name.</p>
114
<p><strong>Правильный вариант</strong>: используйте оператор опциональной цепочки ?., чтобы избежать ошибки.</p>
114
<p><strong>Правильный вариант</strong>: используйте оператор опциональной цепочки ?., чтобы избежать ошибки.</p>
115
console.log(student.group?.name); // undefinedconst user = { default: "значение" };<p><strong>Что может пойти не так</strong>: хотя современные версии JavaScript разрешают это, в старых браузерах или некоторых средах могут возникнуть проблемы.</p>
115
console.log(student.group?.name); // undefinedconst user = { default: "значение" };<p><strong>Что может пойти не так</strong>: хотя современные версии JavaScript разрешают это, в старых браузерах или некоторых средах могут возникнуть проблемы.</p>
116
<p><strong>Совет</strong>: лучше избегать зарезервированных слов и выбрать другое имя, например:</p>
116
<p><strong>Совет</strong>: лучше избегать зарезервированных слов и выбрать другое имя, например:</p>
117
const user = { defaultValue: "значение" };<p>Это называется "висячая запятая":</p>
117
const user = { defaultValue: "значение" };<p>Это называется "висячая запятая":</p>
118
const user = { name: "Алиса", age: 30, // ← запятая здесь };<p>Она помогает легко добавлять новые свойства и избегать конфликтов в системах контроля версий.</p>
118
const user = { name: "Алиса", age: 30, // ← запятая здесь };<p>Она помогает легко добавлять новые свойства и избегать конфликтов в системах контроля версий.</p>
119
<p>Если имя переменной совпадает с именем свойства, можно не указывать его второй раз:</p>
119
<p>Если имя переменной совпадает с именем свойства, можно не указывать его второй раз:</p>
120
const name = "Алиса"; // Вместо const user = { name: name }; // Используйте const user = { name };<p>А для методов можно опустить слово function:</p>
120
const name = "Алиса"; // Вместо const user = { name: name }; // Используйте const user = { name };<p>А для методов можно опустить слово function:</p>
121
const user = { greet() { console.log("Привет!"); } };<p>Чтобы получить список всех ключей или всех значений объекта, используйте:</p>
121
const user = { greet() { console.log("Привет!"); } };<p>Чтобы получить список всех ключей или всех значений объекта, используйте:</p>
122
const user = { name: "Алиса", age: 30 }; console.log(Object.keys(user)); // ["name", "age"] console.log(Object.values(user)); // ["Алиса", 30"]<p>Если в объекте появились свойства с undefined, их лучше удалить, чтобы не хранить пустые данные.</p>
122
const user = { name: "Алиса", age: 30 }; console.log(Object.keys(user)); // ["name", "age"] console.log(Object.values(user)); // ["Алиса", 30"]<p>Если в объекте появились свойства с undefined, их лучше удалить, чтобы не хранить пустые данные.</p>
123
<p>Оператор распространения (...) позволяет собрать несколько объектов в один:</p>
123
<p>Оператор распространения (...) позволяет собрать несколько объектов в один:</p>
124
const obj1 = { a: 1 }; const obj2 = { b: 2 }; const merged = { ...obj1, ...obj2 }; console.log(merged); // { a: 1, b: 2 }<p>Храните данные и методы отдельно. Например, данные юзера и пользовательские настройки:</p>
124
const obj1 = { a: 1 }; const obj2 = { b: 2 }; const merged = { ...obj1, ...obj2 }; console.log(merged); // { a: 1, b: 2 }<p>Храните данные и методы отдельно. Например, данные юзера и пользовательские настройки:</p>
125
const settings = { theme: "dark", language: "en" }; const user = { name: "Алиса", settings: settings }; console.log(user.settings.theme); // "dark"<p><strong>Задача</strong>: есть массив объектов-студентов. Нужно получить новый массив, в котором будут только их имена.</p>
125
const settings = { theme: "dark", language: "en" }; const user = { name: "Алиса", settings: settings }; console.log(user.settings.theme); // "dark"<p><strong>Задача</strong>: есть массив объектов-студентов. Нужно получить новый массив, в котором будут только их имена.</p>
126
<p><strong>Исходный массив:</strong></p>
126
<p><strong>Исходный массив:</strong></p>
127
const students = [ { name: "Анна", age: 20 }, { name: "Марк", age: 22 }, { name: "Юля", age: 19 } ];<p><strong>Решение:</strong></p>
127
const students = [ { name: "Анна", age: 20 }, { name: "Марк", age: 22 }, { name: "Юля", age: 19 } ];<p><strong>Решение:</strong></p>
128
let names = []; // создаём пустой массив для имён // перебираем всех студентов for (let student of students) { // берём имя студента и добавляем его в массив names names.push(student.name); } console.log(names); // ["Анна", "Марк", "Юля"]<p><strong>Что здесь происходит:</strong></p>
128
let names = []; // создаём пустой массив для имён // перебираем всех студентов for (let student of students) { // берём имя студента и добавляем его в массив names names.push(student.name); } console.log(names); // ["Анна", "Марк", "Юля"]<p><strong>Что здесь происходит:</strong></p>
129
<p>1. Мы создаём пустой массив names, куда будем складывать имена.</p>
129
<p>1. Мы создаём пустой массив names, куда будем складывать имена.</p>
130
<p>2. С помощью цикла for...of проходим по каждому элементу массива students.</p>
130
<p>2. С помощью цикла for...of проходим по каждому элементу массива students.</p>
131
<p>3. В каждой итерации берём имя из объекта student (student.name) и добавляем его в массив names.</p>
131
<p>3. В каждой итерации берём имя из объекта student (student.name) и добавляем его в массив names.</p>
132
<p>4. После цикла в names остаются только имена студентов.</p>
132
<p>4. После цикла в names остаются только имена студентов.</p>
133
<p><strong>Задача</strong>:<strong></strong>есть объект user. Нужно посчитать, сколько в нём свойств.</p>
133
<p><strong>Задача</strong>:<strong></strong>есть объект user. Нужно посчитать, сколько в нём свойств.</p>
134
<p><strong>Исходный объект:</strong></p>
134
<p><strong>Исходный объект:</strong></p>
135
const user = { name: "Иван", age: 30, isAdmin: true };<p><strong>Решение:</strong></p>
135
const user = { name: "Иван", age: 30, isAdmin: true };<p><strong>Решение:</strong></p>
136
let count = 0; // начинаем с нуля // перебираем все свойства объекта for (let key in user) { count++; // увеличиваем счётчик на 1 для каждого свойства } console.log(count); // 3<p><strong>Что здесь происходит:</strong></p>
136
let count = 0; // начинаем с нуля // перебираем все свойства объекта for (let key in user) { count++; // увеличиваем счётчик на 1 для каждого свойства } console.log(count); // 3<p><strong>Что здесь происходит:</strong></p>
137
<p>1. Создаём переменную count и даём ей значение 0.</p>
137
<p>1. Создаём переменную count и даём ей значение 0.</p>
138
<p>2. С помощью for...in перебираем все ключи (имена свойств) в объекте user.</p>
138
<p>2. С помощью for...in перебираем все ключи (имена свойств) в объекте user.</p>
139
<p>3. Каждый раз, когда находим свойство, увеличиваем count на 1.</p>
139
<p>3. Каждый раз, когда находим свойство, увеличиваем count на 1.</p>
140
<p>4. После цикла в count хранится количество свойств.</p>
140
<p>4. После цикла в count хранится количество свойств.</p>
141
<p><strong>Задача</strong>: есть объект config. Нужно удалить все свойства, у которых значение равно undefined.</p>
141
<p><strong>Задача</strong>: есть объект config. Нужно удалить все свойства, у которых значение равно undefined.</p>
142
<p><strong>Исходный объект:</strong></p>
142
<p><strong>Исходный объект:</strong></p>
143
let config = { theme: "dark", language: undefined, debug: true, version: undefined };<p><strong>Решение:</strong></p>
143
let config = { theme: "dark", language: undefined, debug: true, version: undefined };<p><strong>Решение:</strong></p>
144
for (let key in config) { if (config[key] === undefined) { delete config[key]; // удаляем свойство } } console.log(config); // { theme: "dark", debug: true }<p><strong>Что здесь происходит:</strong></p>
144
for (let key in config) { if (config[key] === undefined) { delete config[key]; // удаляем свойство } } console.log(config); // { theme: "dark", debug: true }<p><strong>Что здесь происходит:</strong></p>
145
<p>1. Цикл for...in перебирает все свойства объекта config.</p>
145
<p>1. Цикл for...in перебирает все свойства объекта config.</p>
146
<p>2. Внутри цикла проверяем: если значение свойства равно undefined, удаляем его с помощью delete.</p>
146
<p>2. Внутри цикла проверяем: если значение свойства равно undefined, удаляем его с помощью delete.</p>
147
<p>3. После цикла в config остаются только свойства с нормальными значениями.</p>
147
<p>3. После цикла в config остаются только свойства с нормальными значениями.</p>
148
<ul><li><a>Методы библиотеки Lodash для работы с объектами, в том числе метод lodash.cloneDeep() для глубокого копирования объектов, содержащих функции, методы, массивы, даты и вложенные структуры</a></li>
148
<ul><li><a>Методы библиотеки Lodash для работы с объектами, в том числе метод lodash.cloneDeep() для глубокого копирования объектов, содержащих функции, методы, массивы, даты и вложенные структуры</a></li>
149
</ul><a>Курс с трудоустройством: "Профессия Фронтенд-разработчик + ИИ" Узнать о курсе</a>
149
</ul><a>Курс с трудоустройством: "Профессия Фронтенд-разработчик + ИИ" Узнать о курсе</a>