> Какие ключи могут быть в объекте и в Map в JavaScript (JavaScript)

Уровень: middle · Роль: frontend · Категория: Технические вопросы

Компании: Molecula

Стек: JavaScript

> Пример ответа

Короткий ответ

В объекте ключи могут быть только строками или символами (Symbol). Любое другое значение, переданное как ключ, автоматически приводится к строке. В Map ключом может быть любое значение JavaScript: объекты, функции, примитивы (числа, строки, булевы значения, null, undefined, NaN), а также символы. Map сохраняет тип ключа без приведения.

Подробное объяснение

Разница в типах ключей - одно из ключевых отличий между объектом и Map. В объекте все ключи, кроме Symbol, преобразуются в строки. Например, числовой ключ 1 становится строкой "1", а объект, переданный как ключ, превращается в "[object Object]". Это может приводить к неожиданному поведению при использовании объектов в качестве ключей.

Map, в отличие от объекта, использует строгую проверку типов (SameValueZero). Это означает, что ключи 1 и "1" - разные, объекты сравниваются по ссылке, а не по значению. NaN также может быть ключом, хотя в обычных сравнениях NaN !== NaN. Map гарантирует, что каждый ключ уникален по значению и типу.

Порядок итерации также отличается: в Map ключи хранятся в порядке вставки, в объекте - в более сложном порядке (целочисленные ключи сортируются по возрастанию, строковые - в порядке добавления, символы - в конце).

На практике

Выбор между объектом и Map зависит от задачи:

  • Используйте объект, когда нужна простая структура с фиксированными строковыми ключами, сериализация в JSON или доступ через точечную нотацию.
  • Используйте Map, когда ключи динамические, нестроковые, или требуется частая вставка/удаление пар. Map также эффективнее для большого количества операций с ключами.

Пример кода

JAVASCRIPT
const obj = {};
obj[1] = 'number';
obj['1'] = 'string';
console.log(obj); // { '1': 'string' } - ключ перезаписан
const map = new Map();
map.set(1, 'number');
map.set('1', 'string');
console.log(map); // Map(2) { 1 => 'number', '1' => 'string' }
const keyObj = {};
obj[keyObj] = 'object key';
console.log(obj); // { '1': 'string', '[object Object]': 'object key' }
map.set(keyObj, 'object key');
console.log(map); // Map(3) { 1 => 'number', '1' => 'string', {} => 'object key' }

Как отвечать на собеседовании

Начни с ключевого отличия: объект принимает только строки и символы, Map - любые типы. Приведи пример с числом и строкой, чтобы показать разницу в приведении типов. Упомяни, что Map сохраняет порядок вставки и имеет удобные методы (size, has, delete). Если спросят про производительность, скажи, что Map оптимизирован для частых операций с ключами, а объект - для доступа по известным строковым ключам.

Что проверяет интервьюер

Интервьюер проверяет понимание фундаментальных различий между объектом и Map, знание приведения типов в JavaScript, а также умение выбирать подходящую структуру данных под конкретную задачу. Это вопрос на уровень middle, поэтому ожидается не только перечисление фактов, но и объяснение последствий для кода.

Типичные ошибки

  • Утверждение, что в объекте ключом может быть только строка (забывают про Symbol).
  • Путаница между приведением к строке и преобразованием в число (например, думают, что obj[true] станет obj[1]).
  • Незнание, что NaN может быть ключом в Map.
  • Предположение, что объекты в качестве ключей в Map сравниваются по содержимому, а не по ссылке.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью