Читая комментарии OP и Ника , я думаю, что могу немного расширить ответ Адриана , чтобы сделать его более понятным.
Это совершенно правильный JavaScript.
JavaScript обрабатывает имена свойств объекта как строки, объекты не могут содержать другие типы или другие объекты как ключи , они просто строки.
Обозначение в скобках свойство accessor (MemberExpression [ Expression ]
) неявно преобразует выражение в скобках в строку, поэтому:
var obj = {};
obj[{}] = "foo";
alert(obj["[object Object]"]); // foo
В приведенном выше примере вы видите, что я присваиваю значение свойству {}
, а {}.toString()
(или {}+''
) создает строку "[object Object]
(через Object.prototype.toString
) .
Выражение 1 [{}]
неявно преобразует примитив 1 Number
в объект (это делается средством доступа к свойству), и он ищет свойство с именем "[object Object]"
, поиск свойства выполняется на Number.prototype
и Object.prototype
объектов, например:
1['toString'] === Number.prototype.toString; // true
Наконец, выражение 1 [{}]
заключено в квадратные скобки ([1 [{}]]
), на самом деле это литерал Array.
В заключение вот как анализатор вычисляет выражение:
[1 [{}]];
// ^ The accessor expression is evaluated and converted to string
[1 ["[object Object]"]];
// ^ A property lookup is made on an Number object
// trying to access a property named "[object Object]"
[undefined];
// ^ the property is obviously not found
[undefined];
//^ ^
// An array literal is created with an element `0` which its value is `undefined`