@Drovosek01

Как работает это код?

Читаю информацию про аксессоры на MDN: https://developer.mozilla.org/ru/docs/Web/JavaScri...
И наткнулся на такой код:
var foo = {unique_prop: 1}, bar = {unique_prop: 2}, object = {};
object[foo] = 'value';
console.log(object[bar]);

В консоль выводится "value", но почему? Ведь мы не присваивали объекту object свойства с именем bar.

Так же, если попробовать вывести значение свойства foo через точку:
console.log(object.foo);
То выведет undefined (я ожидал 'value').

Почему так происходит?
  • Вопрос задан
  • 423 просмотра
Решения вопроса 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Вот почему:
5be81cc1bc5f3617457314.png

По вашей же ссылке:
Имена свойств могут быть строками. Это значит, что нестроковые объекты могут быть использованы как ключи в объекте. Любой нестроковой объект, включая числа, приводится к строке через метод toString.
...
Также выводит "value", поскольку foo и bar конвертируются в строку. В SpiderMonkey JavaScript движке эта строка будет "['object Object']".
Ответ написан
Комментировать
Вы инициализировали переменные foo и bar.
Дальше, когда вы задаете свойство объекту object, то в качестве ключа берете foo. То есть:
object[foo] = "value"; // foo = {unique_prop: 1}
Возможно вы хотели свойство foo, то есть вот так:
object["foo"] = "value";

Но в вашем примере вы в качестве ключа используете объект, а объект принимает в качестве ключа только строки. Поэтому ваш объект преобразуется в строку и после преобразования получается вот так:
object["[object Object]"] = "value";
Значит ваш object будет такой:
var object = {
"[object Object]":"value"
};

И собственно, когда вы делаете console.log, то объект bar тоже преобразуется в строку и строка принимает вид:
console.log(object["[object Object]"]);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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