webroad.online
  1. 1Веб
  2. 2HTML
  3. 3CSS
  4. 4JavaScript
  5. 5TypeScript
  6. 6Git
  7. 7Инструменты
  8. 8React
  9. 9Стейт-менеджмент
  10. 10Next.js
  11. 11Формы
  12. 12Данные и бэкенд
  13. 13SEO
  14. 14Tailwind CSS
  15. 15Анимации
  16. 16Тестирование
  17. 17Архитектура
JavaScript · Урок 9 из 17

Объекты и деструктуризация

Сокращённая запись, spread, деструктуризация, Object.entries и groupBy.

Обновлено

Что такое объект

Объект — набор пар ключ → значение. Если массив отвечает на вопрос «какой третий элемент?», то объект — «какое имя? а возраст?».

const user = {
  name: 'Ana',          // ключ: значение
  age: 30,
  isAdmin: false,
  address: { city: 'Казань' },          // значением может быть другой объект
  greet() { return `Привет, ${this.name}` },  // или функция (метод)
}

Объекты описывают одну вещь с несколькими свойствами: пользователя, товар, заказ, конфигурацию компонента, props в React.

Массив или объект?

Массив Объект
Доступ по позиции ([0]) по имени (.name)
Порядок важен не важен (на практике)
Для списков похожих вещей описания одной вещи / словаря
Пример products product

Чаще всего — массив объектов: список товаров, где каждый товар — объект.

Создание — полезный синтаксис

const name = 'Ana'
const field = 'email'

const user = {
  name,                         // сокращение — то же, что name: name
  [field]: 'ana@x.com',         // вычисляемый ключ — ключ = значение field
  'full-name': 'Ana Petrova',   // ключ со спецсимволами — в кавычках
}

Доступ — виды и когда

Синтаксис Когда Пример
obj.key ключ фиксирован и известен user.name
obj[expr] ключ в переменной или со спецсимволами user[field], obj['full-name']
obj?.key объекта может не быть user?.address?.city
'key' in obj / Object.hasOwn(obj, 'key') проверить, существует ли ключ не то же, что «значение truthy»

Несуществующее свойство → undefined (не ошибка). Ошибка будет, только если читать что-то из undefined: undefined.city → TypeError. Отсюда ?..

Деструктуризация — достаём поля в переменные

const { name, age } = user                       // две переменные
const { name: userName } = user                  // переименование
const { role = 'user' } = user                   // значение по умолчанию
const { address: { city } } = user               // вложенная
const { password, ...safeUser } = user           // убрать один ключ, остальное сохранить

Чаще всего — в параметрах, именно так выглядят props компонента:

function Card({ title, children, variant = 'default' }) { ... }

Spread — копирование и объединение

const updated = { ...user, age: 31 }           // копия + один изменённый ключ
const settings = { ...defaults, ...userPrefs } // для одного ключа побеждает последнее значение

Spread делает поверхностную копию — вложенные объекты остаются общими. Подробнее — в Ссылки и иммутабельность.

Перебор объекта

Метод Возвращает
Object.keys(obj) ['name', 'age']
Object.values(obj) ['Ana', 30]
Object.entries(obj) [['name', 'Ana'], ['age', 30]]
Object.fromEntries(entries) обратное к entries

Рецепт «преобразовать объект как массив»:

const prices = { apple: 2, pear: 3 }
const doubled = Object.fromEntries(
  Object.entries(prices).map(([fruit, price]) => [fruit, price * 2]),
)

Группировка

Object.groupBy(products, p => p.category)
// { laptops: [...], accessories: [...] }

Объект как словарь (lookup)

Если часто ищете по id, превратите массив в объект (или Map) — поиск станет мгновенным:

const byId = Object.fromEntries(users.map(u => [u.id, u]))
byId[42]   // вместо users.find(u => u.id === 42) каждый раз

Коротко

  • Объект = ключ → значение; описывает одну вещь.
  • .key для фиксированных ключей, [expr] для динамических, ?. — если может отсутствовать.
  • Деструктуризация достаёт поля, spread копирует и объединяет.
  • Object.entries + fromEntries для преобразований.

Официальные источники

Упражнения

Была ли страница полезной?

Один клик — без регистрации.