Странная проблема равенства со свойствами объекта Javascript - PullRequest
3 голосов
/ 24 апреля 2011

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

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

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

значение g [a] равно "дд"?

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

Ответы [ 2 ]

8 голосов
/ 24 апреля 2011

объект 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 - Имена свойств

1 голос
/ 24 апреля 2011

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

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

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

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

Однако будет работать правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...