Можно ли использовать объект в качестве ключа внутри объекта в JavaScript?

«Можно ли использовать объект в качестве ключа внутри объекта в JavaScript?» — вопрос из категории JavaScript, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, в обычных объектах ({}) нельзя. При попытке использовать объект как ключ, JavaScript неявно преобразует его в строку с помощью метода toString(), что для всех объектов дает "[object Object]". Это делает невозможным различение разных объектов.

Пример проблемы:

const obj1 = { id: 1 };
const obj2 = { id: 2 };
const myObject = {};

myObject[obj1] = 'Значение для obj1';
myObject[obj2] = 'Значение для obj2';

console.log(myObject); // { '[object Object]': 'Значение для obj2' }
// Оба ключа стали одной строкой, значение obj1 перезаписано.

Решение: Использовать структуру Map. Map позволяет использовать любые значения (включая объекты, функции, другие Map) в качестве ключей, сохраняя их ссылочную уникальность.

const objKey1 = { projectId: 101 };
const objKey2 = { projectId: 102 };
const myMap = new Map();

myMap.set(objKey1, 'Конфигурация проекта A');
myMap.set(objKey2, 'Конфигурация проекта B');

console.log(myMap.get(objKey1)); // 'Конфигурация проекта A'
console.log(myMap.size); // 2

В Node.js приложениях я часто использую Map для кэширования, где ключом является сложный объект конфигурации или контекст запроса.