Объекты
Создание
const user = {
name: 'Алиса',
age: 25,
'с пробелом': true,
};
Доступ
user.name; // 'Алиса'
user['name']; // 'Алиса'
user['с пробелом']; // true
Через переменную:
const key = 'name';
user[key]; // 'Алиса'
Добавление и изменение
user.email = 'a@b.com';
user['age'] = 26;
Удаление
const { email, ...rest } = user; // без email
// или
delete user.email; // мутирует
Проверка свойства
'name' in user; // true
user.hasOwnProperty('name'); // true
Object.hasOwn(user, 'name'); // ES2022
Опциональная цепочка
user?.address?.city; // undefined, если нет
Методы
const calculator = {
value: 0,
add(n) {
this.value += n;
return this;
},
};
calculator.add(5).add(3);
Ключи, значения, записи
Object.keys(user); // ['name', 'age']
Object.values(user); // ['Алиса', 25]
Object.entries(user); // [['name', 'Алиса'], ['age', 25]]
Слияние
Object.assign({}, a, b);
{ ...a, ...b };
При конфликте ключей выигрывает последний.
Заморозка
Object.freeze(user);
user.name = 'Боб'; // не сработает
Не глубоко:
const deep = Object.freeze({ nested: { x: 1 } });
deep.nested.x = 2; // сработает
Проверка на пустоту
Object.keys(user).length === 0;
Деструктуризация
const { name, age } = user;
const { name: userName, age = 0 } = user; // переименование и дефолт
const { address: { city } = {} } = user;
Spread и rest
const copy = { ...user };
const { name, ...rest } = user;
Вложенные объекты
const data = {
user: {
profile: {
name: 'Алиса',
},
},
};
data.user?.profile?.name;
Копирование
Поверхностное:
const copy = { ...user };
const copy2 = Object.assign({}, user);
Глубокое:
const deep = structuredClone(user);
const deep2 = JSON.parse(JSON.stringify(user));
structuredClone лучше — работает с Date, Map, Set.
Перебор
for (const [key, value] of Object.entries(user)) {
console.log(key, value);
}
Object.groupBy (ES2024)
Object.groupBy(users, (u) => u.role);
// { admin: [...], user: [...] }
Итоги
- Ключи — строки или символы
- Доступ через точку и скобки
Object.keys,values,entries- Spread для копий
structuredCloneдля глубокой копии?.для безопасного доступа