@AfterGen

Почему при обращении по ключу объекта, который сам (ключ) является объектом, всегда возвращается значение последнего ключа?

Привет. Известно, что ключами могут быть только строки или символы, иначе они преобразуются в строки. Но наткнулся на такой пример:
const a = {
  foo: 'bar'
};

const b = {
  bar: 'baz'
};

const someObject = {
  [a]: 1,
  [b]: 2,
}

console.log(someObject[a]) // 2

До меня не доходит, как здесь происходит преобразование и почему результат берется из последнего ключа. Объясните, пожалуйста?
  • Вопрос задан
  • 183 просмотра
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Ключи объектов - это строки, если использовать нестроковое значение в качестве ключа, оно будет преобразовано в строку, дефолтное строковое представление объекта - это "[object Object]". Всё.

Хотите, чтобы объект реально был ключом - записывайте его в Map вместо простого объекта. Или научите свои объекты представлять себя в виде строки, переопределив у них метод toString (конечно, поступать так имеет смысл только в том случае, если вы можете гарантировать, что строковые представления будут уникальны).
Ответ написан
mdlufy
@mdlufy
Frontend developer
У объектов ключами могут быть только строки => при использовании другого объекта в качестве ключа, он будет преобразован в строку.
В результате преобразования объекта в строку, ключом someObject будет "[object Object]"

const a = {
  foo: 'bar'
};

const b = {
  bar: 'baz'
};

const someObject = {
  [a]: 1,   //  т.к. a - объект, у него вызовется метод Object.prototype.toString() и ключом станет "[object Object]"
  [b]: 2,   // аналогично ключом будет "[object Object]"
}

// Т.к. a - объект, то он преобразуется в строку и получаем значение 
// someObject["[object Object]"] = 2
console.log(someObject[a]) // 2


В итоге, вначале устанавливаем someObject["[object Object]"] = 1, а потом изменяем его на someObject["[object Object]"] = 2

Также есть струтура данных Map, ключами которой могут быть не только строки.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы