#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';
Мораль истории: просто не пытайтесь использовать в качестве имен свойств что-либо, кроме строк.
Ответ №2:
a
и b
являются объектами, и вы будете использовать их в качестве ключей при выполнении g[a]
или g[b]
, что не может работать, поскольку ассоциативные массивы могут использовать в качестве ключей только допустимые имена переменных или строки.
Чего вы пытаетесь достичь?
var a = "a";
var b = "b";
var g = {};
g[a] = "aa";
g[b] = "dd";
Однако будет работать должным образом.