Странная проблема равенства со свойствами объекта Javascript

#javascript #object

#javascript #объект

Вопрос:

Почему после выполнения этого фрагмента кода:

 var a = {};
var b = {};

var g = {};
g[a] = "aa";
g[b] = "dd";
  

значение g [a] равно «dd»?

a == b равно false, так что же здесь происходит?

Комментарии:

1. Реализации JavaScript могут иметь некоторые странные скрытые свойства. С каким браузером / движком JavaScript вы тестируете?

Ответ №1:

Ключами объекта JavaScript могут быть только строки. При сохранении g[a] = 'aa' a преобразуется в строку с использованием toString() метода,1 так что вы на самом деле сохраняете 'aa' в g[a.toString()] .

В данном случае a.toString() равно '[object Object]' , что равно b.toString() .

Чтобы сделать это действительно очевидным, код в вашем вопросе эквивалентен этому:

 var g = {};
g['[object Object]'] = 'aa';
g['[object Object]'] = 'dd';
  

Мораль истории: просто не пытайтесь использовать в качестве имен свойств что-либо, кроме строк.


1Источник: MDC: операторы-члены JavaScript — имена свойств

Ответ №2:

a и b являются объектами, и вы будете использовать их в качестве ключей при выполнении g[a] или g[b] , что не может работать, поскольку ассоциативные массивы могут использовать в качестве ключей только допустимые имена переменных или строки.

Чего вы пытаетесь достичь?

 var a = "a";
var b = "b";

var g = {};
g[a] = "aa";
g[b] = "dd";
  

Однако будет работать должным образом.