Каково поведение набора {a: 1}, дающего 1, и {a: 1, b: 2}, дающего ошибку в консоли Javascript? - PullRequest
15 голосов
/ 17 сентября 2010

В Firebug или в jsconsole.com или в другой интерактивной консоли Javascript будет отображаться следующее:

>>> foo = { a : 1, b : 2.2 }
Object { a=1, more...}

>>> foo.a
1

>>> foo.b
2.2

>>> { a : 1, b : 2.2 }
SyntaxError: invalid label { message="invalid label", more...}

>>> { a : 1 }
1

почему 1 возвращает {a : 1} и почему {a : 1, b : 2.2} выдает ошибку? В Ruby они вернутся так же, как вы это определили.

Ответы [ 3 ]

25 голосов
/ 17 сентября 2010

Вторая строка дает вам SyntaxError, потому что токен { в начале вызывает двусмысленность, синтаксический анализатор обрабатывает его так, как если бы он был Block * * * * * объектный литерал.

Например, допустимый оператор Block:

{ foo: 'bar' }

Выше выглядит как литерал объекта, но это не так, потому что код оценивается в контексте оператора .

Он будет проанализирован как Блок, который содержит помеченный оператор (foo), за которым следует выражение ('bar').

Чтобы убедиться, что вы используете грамматику литерала объекта, вы можете заключить его в скобки (также известные как оператор группировки ):

({ foo: 'bar' })

Оператор группировки может принимать только выражения, поэтому двусмысленности нет.

Смотри также:

0 голосов
/ 17 сентября 2010

консоль сделать как eval ('вы вводите')

eval({....}) --- this will get an error
eval('({....})')---eval string as a function
0 голосов
/ 17 сентября 2010

Я не уверен на 100%, но я думаю, что происходит то, что во второй строке вы определяете блок, а не объект. Таким образом, ошибка синтаксического анализа возникает, когда синтаксический анализатор достигает запятой, поскольку он ожидает полуцвет. Определенные метки являются метками, как в операторе goto или switch. Я надеюсь, что это объяснение имеет какой-либо смысл.

...