Объекты: основы

Объекты: основы #

Объект в JavaScript — составное значение: набор пар «ключ — значение», где ключ — строка или Symbol, а значение — любой тип данных. Объекты описывают сущности предметной области: корзину покупок, профиль пользователя, элемент плейлиста или тело HTTP-запроса.


Литерал объекта #

Самый частый способ создать объект — литерал в фигурных скобках:

const cart = {
  id: 'cart-7a2',
  currency: 'RUB',
  items: [],
  updatedAt: null,
}

Ключи без кавычек — это идентификаторы; значения разделяются запятыми. Последняя запятая после последнего свойства допустима (trailing comma).

Для пустого объекта достаточно {}. Альтернатива — new Object(), но в прикладном коде почти всегда используют литерал.


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

Два эквивалентных способа чтения и записи:

НотацияКогда удобна
точечная obj.keyключ — валидный идентификатор, известен на этапе написания кода
скобочная obj['key']ключ в переменной, содержит пробелы или спецсимволы
const profile = {
  userId: 'u-104',
  displayName: 'Мария К.',
  'preferred-lang': 'ru',
}

profile.displayName // "Мария К."
profile['preferred-lang'] // "ru"

const field = 'userId'
profile[field] // "u-104"

Обращение к несуществующему свойству возвращает undefined, а не ошибку:

profile.phone // undefined

Добавление и изменение свойств #

Объекты мутабельны: можно добавлять, перезаписывать и удалять свойства после создания (если объект не заморожен — об этом в продвинутых темах).

const playlist = {
  title: 'Focus Tracks',
  trackCount: 0,
}

playlist.trackCount = 12
playlist.isPublic = true
playlist['coverUrl'] = '/covers/focus.jpg'

Сокращённая запись при совпадении имени переменной и ключа:

const title = 'Evening Mix'
const ownerId = 'u-104'

const eveningPlaylist = { title, ownerId }
// то же, что { title: title, ownerId: ownerId }

Вычисляемые ключи — имя свойства задаётся выражением в квадратных скобках при создании:

const prefix = 'api'
const payload = {
  [`${prefix}Version`]: 2,
  [`${prefix}Key`]: 'sk_live_***',
}
// { apiVersion: 2, apiKey: 'sk_live_***' }

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

Оператор delete убирает собственное свойство объекта:

const draft = {
  status: 'draft',
  internalNote: 'не публиковать',
}

delete draft.internalNote
// draft: { status: 'draft' }

delete возвращает true, если удаление прошло (или свойства не было), и false для неизменяемых свойств. На производительность частых delete в горячих циклах стоит обратить внимание; в обычном прикладном коде это редкая операция.

Чтобы «обнулить» значение, но оставить ключ, присвойте null или undefined — структура объекта для Object.keys сохранится.


Вложенные объекты #

Свойство может быть другим объектом или массивом — так строятся API payload и доменные модели:

const apiPayload = {
  event: 'cart.updated',
  data: {
    cartId: 'cart-7a2',
    totals: { subtotal: 1490, discount: 0 },
    items: [{ sku: 'kb-01', qty: 1 }],
  },
  meta: { sentAt: '2026-07-14T12:00:00Z' },
}

apiPayload.data.totals.subtotal // 1490
apiPayload['data']['items'][0].sku // "kb-01"

Глубокая вложенность читается цепочкой точек; при динамических ключах комбинируйте скобочную нотацию на нужном уровне.


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

Оператор in проверяет ключ в объекте и в цепочке прототипов; hasOwnProperty — только собственные свойства (подробнее о прототипах — см. раздел ООП):

const item = { sku: 'kb-01', qty: 1 }

'sku' in item // true
item.hasOwnProperty('qty') // true
item.hasOwnProperty('toString') // false — унаследованный метод

Для собственных ключей в современном коде часто используют Object.hasOwn(item, 'sku') — тот же смысл, короче запись.


Объект как ссылка #

Переменная хранит не «копию объекта», а ссылку на него в памяти. Подробнее о копировании — в статье Копирование и ссылки.

const original = { count: 1 }
const alias = original

alias.count = 2
original.count // 2 — один и тот же объект

Тип object для переменных с объектами описан в разделе переменные и типы данных.


Итог #

  • Объект — коллекция пар ключ–значение; создаётся литералом { }.
  • Чтение и запись: точечная и скобочная нотация; скобки нужны для динамических ключей.
  • Свойства добавляют присваиванием; удаляют через delete.
  • Сокращённая запись и вычисляемые ключи упрощают сборку объектов из переменных.
  • Переменная с объектом держит ссылку, а не отдельную копию данных.

См. также #

Часто спрашивают

Почему this «потерялся» в колбэке?
У обычной функции this зависит от способа вызова. Сохраните контекст через bind или используйте стрелочную функцию осознанно. Подробнее