Ответ
В 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`.