Объекты
Примитивы
Объекты
Типы данных JS
- string
- number
- boolean
- null
- undefined
- symbol
- object
let user = new Object(); // синтаксис "конструктор объекта"
let user = {}; // синтаксис "литерал объекта"
Создание объекта
let user = {
key1: "Карточка Никиты",
key2: "Карточка Игоря",
key3: "Карточка Васьки"
}; Создание объекта

console.log(user.key1);
Карточка Никиты
let user = {
name: "John",
age: 30
};
Для свойств, имена которых состоят из нескольких слов, доступ к значению «через точку» не работает:
// это вызовет синтаксическую ошибку
user.likes birds = true;Так происходит, потому что точка требует, чтобы ключ был именован по правилам именования переменных. То есть не имел пробелов, не начинался с цифры и тд
Для таких случаев существует альтернативный способ доступа к свойствам через квадратные скобки. Такой способ сработает с любым именем свойства:
let user = {};
// присваивание значения свойству
user["likes birds"] = true;
// получение значения свойства
alert(user["likes birds"]); // true
// удаление свойства
delete user["likes birds"];let key = "likes birds";
// то же самое, что и user["likes birds"] = true;
user[key] = true;Квадратные скобки также позволяют обратиться к свойству, имя которого может быть результатом выражения. Например, имя свойства может храниться в переменной:
Внимание. КОД!
let user = {
name: "John",
age: 30
};
let key = prompt("Что вы хотите узнать о user?", "name");
// доступ к свойству через переменную
alert( user[key] ); // John (если ввели "name")let key = "name";
alert( user.key ); // undefinedЗапись «через точку» такого не позволяет:
let user = {};
alert( user.name === undefined );Проверка существования свойства
Также существует специальный оператор "in" для проверки существования свойства в объекте.
let user = {
name: "John",
age: 30
};
alert( "age" in user ); // true, user.age существует
alert( "blabla" in user ); // false, user.blabla не существуетОбычно строгого сравнения "=== undefined" достаточно для проверки наличия свойства. Но есть особый случай, когда оно не подходит, и нужно использовать "in".
Это когда свойство существует, но содержит значение undefined:
let obj = {
test: undefined
};
alert( obj.test === undefined); // true свойства не существует!
alert( "test" in obj ); // true, свойство существует!Цикл «for…in»
Для перебора всех свойств объекта используется цикл for..in. Этот цикл отличается от изученного ранее цикла for(;;).
for (let key in object) {
// тело цикла выполняется для каждого свойства объекта
}let user = {
name: "John",
age: 30,
isAdmin: true
};
for (let key in user) {
// ключи
alert( key ); // name, age, isAdmin
// значения ключей
alert( user[key] ); // John, 30, true
}Копирование по ссылке
Одним из фундаментальных отличий объектов от примитивных типов данных является то, что они хранятся и копируются «по ссылке».
Примитивные типы: строки, числа, логические значения – присваиваются и копируются «по значению».
let message = "Hello!";
let phrase = message;В результате мы имеем две независимые переменные, каждая из которых хранит строку "Hello!".

Объекты ведут себя иначе...
Переменная хранит не сам объект, а его «адрес в памяти», другими словами «ссылку» на него.
let user = {
name: "John"
};
Когда переменная объекта копируется – копируется ссылка, сам же объект не дублируется.
let user = { name: "John" };
let admin = user; // копируется ссылка
Теперь у нас есть две переменные, каждая из которых содержит ссылку на один и тот же объект:
Мы можем использовать любую из переменных для доступа к ящику и изменения его содержимого:
let user = { name: 'John' };
let admin = user;
admin.name = 'Pete'; // изменено по ссылке
alert(user.name); // 'Pete', видны по ссылке в "user"Сравнение объектов
let a = {};
let b = a; // копирование по ссылке
// обе переменные ссылаются на один и тот же объект
alert( a === b ); // true
alert( a === b ); // truelet a = {};
let b = {}; // два независимых объекта
alert( a === b ); // falseДва объекта равны только в том случае, если это один и тот же объект.
В примере ниже два разных объекта не равны, хотя и оба пусты:
кінець, хлопці
Объекты
By Techno School
Объекты
- 23