Проверяет понимание преобразования объектов в строковые ключи при использовании их в качестве свойств обычного JavaScript-объекта.
В обычных объектах JavaScript ключи всегда являются строками (или символами). Когда вы используете объект в качестве ключа, движок неявно вызывает его метод toString(), чтобы получить строковое представление. Если метод не переопределён, базовый Object.prototype.toString() возвращает строку '[object Object]'.
Это означает, что все объекты без собственного toString() будут иметь одинаковый ключ. Например:
const obj = {};
const a = { id: 1 };
const b = { id: 2 };
obj[a] = 'first';
obj[b] = 'second';
console.log(obj); // { '[object Object]': 'second' }Здесь оба объекта преобразуются в одну и ту же строку, поэтому второе присваивание перезаписывает первое. Это часто приводит к неожиданным ошибкам, если разработчик ожидает уникальные ключи для разных объектов.
Для надёжного использования объектов в качестве ключей применяйте Map, который поддерживает любые типы ключей без преобразования. Или переопределите toString() у объекта, чтобы возвращать уникальную строку:
const a = { id: 1, toString() { return this.id; } };
const b = { id: 2, toString() { return this.id; } };
const obj = {};
obj[a] = 'first';
obj[b] = 'second';
console.log(obj); // { '1': 'first', '2': 'second' }Также можно использовать Symbol как ключ, но это отдельная тема.
Понимание этого поведения важно для избежания скрытых багов при работе с объектами как с ассоциативными массивами. Если нужны сложные ключи, предпочтительнее использовать Map или явно задавать строковые идентификаторы.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию