Вопрос проверяет понимание исторических и архитектурных причин поведения объектов в JavaScript.
Ключи объекта приводятся к строке, потому что объект в JavaScript изначально задумывался как словарь “строка → значение”. Такое решение упрощает модель данных и делает доступ к свойствам быстрым и предсказуемым. Это поведение закреплено в спецификации языка. Исключением являются Symbol, добавленные позже.
Приведение ключей к строке — это автоматическое преобразование значения ключа в строку при использовании его в объекте.
Сначала объяснение словами. JavaScript создавался как простой язык для браузеров, и объект рассматривался как ассоциативный массив со строковыми ключами.
Простая реализация
Быстрый доступ к свойствам
Минимальная сложность модели
Когда вы пишете:
obj[key] = value;
JavaScript делает следующее:
Если key — symbol, он используется напрямую
Во всех остальных случаях вызывается приведение к строке
const obj = {};
obj[10] = "ten";
console.log(obj["10"]); // "ten"
Коллизии ключей:
const obj = {};
obj[1] = "a";
obj["1"] = "b";
console.log(obj[1]); // "b"
Неочевидные ключи вида "[object Object]"
При работе с данными из API
При динамическом формировании объектов
При выборе между Object и Map
Ключи объектов приводятся к строке из-за архитектурных решений JavaScript и требований спецификации. Если нужно хранить данные с ключами любого типа без преобразований, стоит использовать Map.