2016-09-01 4 views
4

Практикуя несколько примеров, я столкнулся следующий пример:Понимание литералов объектов

var foo = {unique_prop: 1}; 
var bar = {unique_prop: 2}; 
var object = {}; 
object[foo] = 'value'; 
alert(object[bar]); 

где создаются два объекта Foo и бар. Я не получаю предупреждение (object [bar]); является «значением». Какая связь здесь между foo и bar.

Кроме того, небольшое изменение даст выход как «неопределенный» в качестве примера ниже.

var foo = {unique_prop: 1}; 
var bar = {unique_prop: 2}; 
var object = {}; 
object["foo"] = 'value'; 
alert(object[bar]); 

По умолчанию [] обозначения можно использовать строки вправо, Арент ["some_property"] и [some_property] то же самое?

+5

Ссылка между 'foo' и' bar' заключается в том, что они дают одинаковый результат при нажатии на строку (все ключи свойства) – Bergi

+4

"* arent' ["some_property"] 'и' [some_property] ' то же самое? * "- № – Bergi

+0

Кстати, как преобразование' Object' в примитив регулируется методами 'valueOf' или' toString' (первый имеет приоритет над последним, если оба определены). – ftor

ответ

6

При использовании квадратных скобок нотации внутри квадратных скобок преобразуются в строку. Затем эта строка используется для поиска свойства, называемого одним и тем же.

var foo = {unique_prop: 1}; 
var bar = {unique_prop: 2}; 
var object = {}; 

object[foo] = 'value'; 
// foo is an object, so it's automatically turned into the string "[object Object]" 
// so the above code is equivalent to `object["[object Object]"] = 'value';` 

alert(object[bar]); 
// bar is also an object, so is converted into the same string 
// the above code is also equivalent to `alert(object["[object Object]"]);` which of course accesses that same value 

var blah = "not blah"; 
object.blah = 1; 
object["blah"] = 1; 

object[blah]; 
// a variable is used. 
// therefore the value of that variable is what the assessor is looking for, not the name of the variable. 
// so the above code is equivalent to `object["not blah"];`. 
0

ключи объекта может быть только строки *, поэтому, когда вы доступ к свойству объекта, используя значение, которое не является строкой, то он преобразуется в строку.

В ECMAScript 6 вы можете использовать Map, который похож на объекты, но вы можете использовать любое значение в качестве ключа. Пример:

const foo = {unique_prop: 1} 
const bar = {unique_prop: 2} 
const map = new Map() 
map.set(foo, 'value') 
console.log(map.get(bar)) // undefined 

* В ECMAScript 6 вы можете также использовать symbols, но это не имеет значения здесь.

Смежные вопросы