Урок 09

Объекты

Создание

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 для глубокой копии
  • ?. для безопасного доступа