Learn JavaScript

Объекты в JavaScript: свойства, чтение и запись

Объект (object) - это структура данных, которая хранит пары “ключ - значение”. Объекты удобны, когда нужно описывать сущности со свойствами: например, пользователь с именем и возрастом, настройки, результаты вычислений.

Как создать объект

Самый частый способ - литерал объекта:

const user = {
  name: "Sam",
  age: 20,
  isActive: true
};

console.log(user);

Пустой объект:

const data = {};

Свойства: ключи и значения

Ключи в объекте обычно строки (даже если записаны без кавычек). Значения могут быть любыми типами: числами, строками, массивами, другими объектами, функциями.

const profile = {
  id: 1,
  name: "Alex",
  tags: ["js", "web"],
  settings: { theme: "dark" }
};

Чтение свойства: точка

Если имя свойства известно заранее и подходит под формат идентификатора, используют точку.

const user = { name: "Sam", age: 20 };

console.log(user.name); // "Sam"
console.log(user.age);  // 20

Если свойства нет, будет undefined:

const user = { name: "Sam" };

console.log(user.email); // undefined

Запись свойства: точка

Свойство можно создать или изменить.

const user = { name: "Sam" };

user.age = 20;
user.name = "Alex";

console.log(user); // { name: "Alex", age: 20 }

Чтение и запись: квадратные скобки

Квадратные скобки нужны, когда:

  • имя свойства хранится в переменной
  • в ключе есть пробелы или дефисы
  • ключ не подходит для записи через точку

Ключ в переменной

const user = { name: "Sam", age: 20 };

const key = "name";
console.log(user[key]); // "Sam"

Ключ с дефисом или пробелом

const obj = {
  "background-color": "#000",
  "full name": "Sam Doe"
};

console.log(obj["background-color"]); // "#000"
console.log(obj["full name"]);        // "Sam Doe"

Запись через скобки

const obj = {};
const key = "status";

obj[key] = "ok";
console.log(obj); // { status: "ok" }

Удаление свойства

Свойство можно удалить оператором delete.

const user = { name: "Sam", age: 20 };

delete user.age;
console.log(user); // { name: "Sam" }

Обычно delete используют редко. Часто проще не удалять свойство, а хранить null или undefined по смыслу, но это зависит от задачи.

Проверка наличия свойства

Через сравнение с undefined

Так можно проверить, что значение задано, но важно помнить: свойство может существовать и иметь значение undefined.

const user = { name: "Sam" };

console.log(user.email === undefined); // true

Оператор in

in проверяет наличие ключа в объекте (включая унаследованные свойства).

const user = { name: "Sam" };

console.log("name" in user);  // true
console.log("email" in user); // false

Для учебных примеров этого достаточно. Более точные проверки будут дальше, когда появится тема прототипов.

Объект - ссылочный тип

Как и массивы, объекты передаются по ссылке.

const a = { n: 1 };
const b = a;

b.n = 99;

console.log(a.n); // 99
console.log(b.n); // 99

Если нужна поверхностная копия, можно использовать spread:

const a = { n: 1, m: 2 };
const b = { ...a };

b.n = 99;

console.log(a); // { n: 1, m: 2 }
console.log(b); // { n: 99, m: 2 }

Частые ошибки

1) Путаница: точка vs скобки

Если ключ лежит в переменной, точка не подойдет:

const user = { name: "Sam" };
const key = "name";

console.log(user.key);  // undefined
console.log(user[key]); // "Sam"

2) Ошибка при чтении вложенного свойства

Если промежуточный объект отсутствует, будет TypeError:

const user = { name: "Sam" };

try {
  console.log(user.settings.theme);
} catch (e) {
  console.log(e.name); // "TypeError"
}

Дальше будет способ писать такие проверки проще (optional chaining).

Что стоит запомнить

  • Объект хранит пары “ключ - значение”.
  • Чтение и запись через точку удобны, когда ключ известен.
  • Скобки нужны для ключей в переменной или ключей с пробелами/дефисами.
  • Если свойства нет, чтение даст undefined.
  • Объекты передаются по ссылке, для копии используют { ...obj }.