В JavaScript ключи свойств объекта должны быть строками (или Symbols). Когда в качестве ключа используется значение, которое не является строкой, JavaScript автоматически вызывает на нём .toString().
Когда ты используешь b и c в качестве ключей, JavaScript преобразует их, вызывая .toString() на каждом. Поскольку оба являются обычными объектами, они возвращают одну и ту же строку:
[object Object]
Это означает, что a[b] и a[c] — это идентичные обращения к свойству — оба разрешаются в a["[object Object]"].
a[b] = 123 → сохраняет 123 под ключом "[object Object]"a[c] = 456 → перезаписывает тот же ключ значением 456a[b] → читает "[object Object]", в котором теперь содержится 456console.log(a[b]); // 456
Использование обычных объектов в качестве ключей свойств — распространённая ошибка: все обычные объекты имеют одинаковый результат .toString(), что приводит к неожиданным коллизиям ключей. Чтобы безопасно использовать объекты в качестве ключей, лучше возьми Map — она принимает любое значение в качестве ключа без преобразования.
Когда в JavaScript используется нестроковое значение как ключ свойства объекта, язык автоматически вызывает toString() на этом значении, чтобы преобразовать его в строку.
Новый — ещё не проверен сообществом
Вы