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