Что является стандартным для объекта в JavaScript? - PullRequest
3 голосов
/ 15 января 2010
{id:1,name:'test'}

или

{'id':1,'name':'test'}

Я видел, как они оба использовали много раз, и теперь я в замешательстве!

Ответы [ 6 ]

11 голосов
/ 15 января 2010

В JavaScript эти два пути эквивалентны почти , вы можете использовать оба, но в версии без кавычек вы не можете определить свойства с именами зарезервированных ключевых слов, например :

// valid
var obj = {
  'for': 'test'
};

// SyntaxError
var obj = {
  for: 'test'
};

Именно поэтому стандарт JSON разрешает по спецификации использовать только ключи в кавычках .

Редактировать: Хорошо, теперь давайте посмотрим, почему.

Грамматика Инициализатор объекта определяется следующим образом:

ObjectLiteral :
    {}
    { PropertyNameAndValueList }

PropertyNameAndValueList :
    PropertyName : AssignmentExpression 
    PropertyNameAndValueList , PropertyName : AssignmentExpression 

И токен PropertyName может быть:

PropertyName :
    Identifier 
    StringLiteral 
    NumericLiteral

Если это Идентификатор , по спецификации довольно ясно и ясно, что это не может быть Зарезервированное слово , потому что:

7.5.1 Reserved Words
Description

Reserved words cannot be used as identifiers.

И первое определение Идентификатора грамматики:

Identifier ::
    IdentifierName but not ReservedWord
3 голосов
/ 15 января 2010

Если вместо одинарных кавычек используются двойные кавычки, вторая будет JSON совместимой.

3 голосов
/ 15 января 2010

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

С кавычками это всегда строка, иначе интерпретатор может интерпретировать ее как буквальное ключевое слово / переменную.

2 голосов
/ 15 января 2010

Вы можете использовать либо строку, либо идентификатор для указания свойства объекта. Вы даже можете смешать их:

var o = { 'id': 1, name: 'test'}

Оба способа дают один и тот же результат (за исключением того, что вы также можете использовать ключевые слова и символы-разделители при использовании строки).

Аналогичным образом вы можете использовать идентификатор или строку для чтения свойств:

alert(o.id);
alert(o['name']);

Обратите внимание, что свойство, созданное с использованием строки, может быть прочитано с использованием идентификатора и наоборот, что показывает, что это только разные способы создания и доступа к свойствам, полученные свойства одинаковы независимо от способа их создания. 1009 *

1 голос
/ 15 января 2010

Я обычно цитирую ключ и значение, чтобы быть в безопасности. Некоторые ключевые слова и другие ограничения могут вызвать ошибки в ваших ключах, если они не заключены в кавычки.

0 голосов
/ 15 января 2010

Определяя подобный объект, вы просто объявляете идентификаторы или переменные. У идентификаторов есть определенные правила, которые вы можете проверить в спецификации ECMAScript в свободное время, но обе формы эквивалентны. Однако браузеры ведут себя иначе, когда вы пытаетесь использовать зарезервированные или будущие зарезервированные ключевые слова. Например, их нельзя использовать в качестве идентификаторов

break
do
instanceof
typeof 
case
else
new
var 
catch
finally
return
void 
continue
for
switch
while 
debugger
function
this
with 
default
if
throwdelete
in
try

Не все браузеры помечают это как ошибку, но некоторые могут. И есть список зарезервированных ключевых слов в будущем:)

class
enum
extends
super
const
export
import

Чтобы быть в безопасности, и не нужно каждый раз искать спецификации, я бы сказал, что лучше указывать ваши идентификаторы. Чтобы действительно увидеть проблему, проверьте их в Safari, по крайней мере, в версии 4.0.4, когда вы используете любое из этих ключевых слов в качестве идентификаторов. Например, попробуйте это:

var class = "my class";

Не будет работать в простом объявлении или в объявлении объекта типа JSON:

var myObject = {
    goodProperty: "this works",
    class: "gimmeh the errarz codez!",
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...