2016-07-14 2 views
0

В чем разница между ниже:Доступ к JavaScript объект с помощью [] Обозначения

var ourDog = { 
    "name": "Camper" 
}; 

и

var ourDog = { 
    name: "Camper", 
}; 

И как это может вернуть Camper для ourDog["name"] в обоих случаях.

Есть ли какие-либо преобразования, происходящие за сценой, когда мы обращаемся к свойствам объекта с помощью записи []?

+0

вы можете использовать кронштейн обозначения, если объект 'keys' являются динамическими – Arif

+0

Если имя свойства имеет место, то' уаг ourDog = { «имя»: «Camper» }; ', то она не будет работа без кавычек – gurvinder372

+0

Я понимаю, что это использование, мое сомнение в том, как он дает одинаковый результат для обоих объектов; Я имею в виду цитаты и без кавычек. – blueMoon

ответ

0

http://ecma-international.org/ecma-262/6.0/#sec-object-initializer

Имя свойства может быть только имя идентификатора (то есть идентификаторы + зарезервированных слов), строковым или числовой литерал.

вы не можете использовать числовой литерал с помощью точечной нотации, но скобки обозначения работы:

var ourDog = { 
    123: "Camper", 
}; 

Выход

ourDog[123] // Camper 

но

ourDog.123 // SyntaxError 

для получения дополнительной информации посмотрите в this

0

Имена объектов должны быть строками. Это означает, что нестроковые объекты не могут использоваться в качестве ключей в объекте. Любой не-строковый объект, в том числе ряд, является typecasted в строку с помощью метода ToString

var object = {}; 
object['1'] = 'value'; 
console.log(object[1]); 

Это выводит «значение», так как 1 typecasted в «1».

Пример от MDN

1

Проверить specs

PropertyDefinition: ИмяСвойства: ВыражениеПрисваивании

  1. Возврат Имя_свойство из PropertyName.

Эта часть спецификации предлагает формальный синтаксис имени свойства с его значением.

Кроме того, перед тем, что this part of the spec предположить, что ИмениСвойства может быть literalPropertyName, которые не должны быть описаны в виде строки.

ИмяСвойства [Выход]:

LiteralPropertyName

ComputedPropertyName [?Выход]

LiteralPropertyName:

ИмяИдентификатора

СтроковойЛитерал

ЧисловойЛитерал

Именно поэтому вы получите тот же результат для обоих name d "name".

Однако, если имя свойства first name, то вам нужно использовать строку, иначе вы получите ошибку компиляции, поскольку после имени свойства ожидается двоеточие :.

//correct syntax 
var ourDog = { 
    "first name": "Camper" 
}; 

//incorrect syntax 
var ourDog = { 
    first name: "Camper" //since after first there is no colon so there will be compilation error 
}; 
+0

Спасибо Gurvinder +1! Это будет очень полезно, если бы вы могли более подробно описать это на простом языке, и это было трудно понять как новичок. – blueMoon

+0

Говоря простыми словами, JS движок ожидает буквальное имя свойства без кавычек, если значение является действительным примитивным значением, иначе оно должно быть в кавычках. – gurvinder372

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