Объекты

Объект — это неупорядоченная коллекция пар ключ-значение. Ключ — это строка (или символ), значение — любой тип данных: число, строка, массив, другой объект, функция.

Объекты используются для хранения структурированных данных: профиль пользователя, настройки приложения, ответ от API, данные задачи с метаданными.

Создание объекта

Самый распространённый способ — через литерал:

const user = {
  name: 'Анна',
  age: 28,
  isAdmin: false
};

Можно создать через конструктор, но это редко используется:

const settings = new Object();
settings.theme = 'dark';
settings.language = 'ru';

Литерал {} предпочтительнее: короче, понятнее, быстрее.

Доступ к свойствам

Точечная запись

Если ключ — валидный идентификатор (без пробелов, спецсимволов, не начинается с цифры):

console.log(user.name); // "Анна"
console.log(user.age);  // 28

Скобочная запись

Используется, если ключ содержит пробелы, спецсимволы, или если имя свойства динамическое:

console.log(user['name']); // "Анна"
console.log(user['age']);  // 28

const prop = 'isAdmin';
console.log(user[prop]); // false

Также скобки нужны для ключей с пробелами:

const person = {
  'first name': 'Иван',
  'last-name': 'Петров'
};

console.log(person['first name']); // "Иван"
console.log(person['last-name']);  // "Петров"

Используйте точечную запись, если возможно — она читаемее. Используйте скобочную, когда нужно динамическое имя свойства.

Динамическое добавление и удаление

Добавление

Просто присваиваем значение новому ключу:

user.email = 'anna@example.com';
user['phone'] = '+7 (999) 123-45-67';

Теперь объект выглядит так:

{
  name: 'Анна',
  age: 28,
  isAdmin: false,
  email: 'anna@example.com',
  phone: '+7 (999) 123-45-67'
}

Удаление

Оператор delete:

delete user.age;
console.log(user.age); // undefined

Удаление не влияет на структуру других свойств — просто убирает пару ключ-значение.

Методы объектов

Функция может быть значением свойства — тогда она называется методом:

const calculator = {
  a: 5,
  b: 3,
  add() {
    return this.a + this.b;
  },
  multiply() {
    return this.a * this.b;
  }
};

console.log(calculator.add());     // 8
console.log(calculator.multiply()); // 15

this внутри метода ссылается на сам объект — это важно для доступа к его свойствам.

Объекты передаются по ссылке

Это ключевая особенность в сравнении с примитивными типами данных.

Когда вы присваиваете объект переменной, вы не копируете его содержимое — вы копируете ссылку на место в памяти.

const user1 = { name: 'Игорь' };
const user2 = user1; // Это не копия — это та же самая ссылка

user2.name = 'Мария';
console.log(user1.name); // "Мария" — изменилось и в user1!

Это значит:

  • Изменение одного объекта влияет на все переменные, ссылающиеся на него.
  • При передаче объекта в функцию — функция может изменить его содержимое.

Чтобы избежать этого, нужно создавать копию объекта — об этом позже в разделе про распаковку.

Пример опасности:

function updateName(user) {
  user.name = 'Аноним';
}

const profile = { name: 'Сергей' };
updateName(profile);
console.log(profile.name); // "Аноним" — исходный объект изменён!

Всегда помните: объекты — ссылочные типы. Если вам нужна независимая копия — используйте клонирование.