Вопрос проверяет понимание того, как JavaScript обрабатывает ключи объектов и какие типы реально поддерживаются.
Ключами обычного объекта могут быть только строки и Symbol. Если использовать другие типы (числа, объекты, boolean), они автоматически приводятся к строке. Это происходит неявно и может приводить к неожиданным конфликтам ключей. Symbol — единственный тип, который не приводится к строке.
Ключ объекта — это идентификатор свойства, по которому значение хранится и извлекается из объекта.
Перед перечислением важно подчеркнуть: не всё, что вы пишете в квадратных скобках, реально остаётся своим типом.
Строки (string)
Символы (symbol)
const obj = {
name: "Alex"
};
const sym = Symbol("id");
obj[sym] = 123;
Все остальные типы приводятся к строке.
Числа:
const obj = {};
obj[1] = "one";
console.log(Object.keys(obj)); // ["1"]
Boolean:
obj[true] = "yes"; // ключ "true"
Объекты:
const key = {};
obj[key] = "value";
console.log(Object.keys(obj)); // ["[object Object]"]
symbol — особый случайSymbol не приводится к строке
Каждый Symbol уникален
Ключи-символы не участвуют в обычных перечислениях (Object.keys)
Если нужны ключи “любого типа” без приведения:
Используйте Map
Там ключами могут быть объекты, функции и примитивы без преобразования
В обычных объектах реальными ключами являются только строки и Symbol. Все остальные типы неявно приводятся к строке, что важно учитывать при проектировании структуры данных.