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

Ответ

Нет, в обычных объектах ({}) нельзя. При попытке использовать объект как ключ, 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 для кэширования, где ключом является сложный объект конфигурации или контекст запроса.

Ответ 18+ 🔞

Да ты что, серьёзно? Ну вот смотри, в обычных объектах, в этих фигурных скобках {}, нихуя нельзя использовать объект как ключ. Совсем. Ядрёна вошь! 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 перезаписано.

Видишь? Второй объект просто нагло перезаписал значение первого, потому что оба стали строкой '[object Object]'. Доверия к такому механизму — ноль ебать.

Выход есть, и он гениально простой: Используй 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 для какого-нибудь кэша, где ключ — это целый объект конфигурации или контекст запроса. Удобно, быстро, и не надо бздеть, что всё накроется медным тазом.