Какие типы данных могут быть ключами в объекте JavaScript?

«Какие типы данных могут быть ключами в объекте JavaScript?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В JavaScript ключами в обычном объекте (созданном с помощью {} или new Object()) могут быть только значения типа String (строка) или Symbol (символ). Любое другое значение будет автоматически приведено к строке.

1. Строки (String)

  • Самый распространенный тип ключа.
  • Числа, булевы значения и другие примитивы автоматически конвертируются в строку.
    
    const obj = {};
    obj['name'] = 'Alice';     // Явная строка
    obj[42] = 'The Answer';    // Число 42 → строка "42"
    obj[true] = 'Yes';         // Boolean true → строка "true"
    obj[{}] = 'object';        // Object {} → строка "[object Object]"

console.log(Object.keys(obj)); // ['name', '42', 'true', '[object Object]']


**2. Символы (Symbol)**
*   Уникальные и неизменяемые идентификаторы. Не преобразуются в строку.
*   Не перечисляются методами вроде `Object.keys()` или `for...in`.
```javascript
const idSym = Symbol('id');
const user = {
    name: 'Bob',
    [idSym]: 123456 // Символ как ключ
};

console.log(user[idSym]); // 123456
console.log(Object.keys(user)); // ['name'] (символ не виден)
console.log(Reflect.ownKeys(user)); // ['name', Symbol(id)]

Важное отличие: Map

  • Если нужны ключи любого типа (объекты, массивы, функции), используйте коллекцию Map.
    
    const map = new Map();
    const keyObj = { id: 1 };
    map.set(keyObj, 'Value for object key');
    map.set(42, 'Value for number key');

console.log(map.get(keyObj)); // 'Value for object key'


**Итог:** Для обычных объектов — только строки и символы. Для произвольных ключей — используйте `Map`.