Как ведет себя набор {a:1}, дающий 1, и {a:1, b:2}, дающий ошибку в консоли Javascript?

Следующее будет отображаться в 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 они вернутся так же, как вы это определили.


person nonopolarity    schedule 17.09.2010    source источник
comment
Это отличный вопрос, за которым следует потрясающий ответ! Очевидно, я говорю об ответе CMS.   -  person Marcus Stade    schedule 17.09.2010
comment
stackoverflow.com/questions/1509535/javascript-false- and-false/ — это, казалось бы, неуместный вопрос, но с соответствующим ответом на одну вещь, на которую вы можете споткнуться.   -  person Crescent Fresh    schedule 17.09.2010


Ответы (3)


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

Например, правильный оператор Block:

{ foo: 'bar' }

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

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

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

({ foo: 'bar' })

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

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

person Christian C. Salvadó    schedule 17.09.2010
comment
+1 Сегодня я узнал кое-что новое. Я никогда не помещал в REPL только объектно-литеральный синтаксис, не назначая его переменной, но это интересно знать. - person Matt; 17.09.2010
comment
(«Помеченный оператор» — это то, что JavaScript унаследовал от C, где его можно использовать для goto​. Помеченные операторы почти никогда не используются в JavaScript, поэтому удивительно, что {foo: 'bar'} можно воспринимать как допустимый оператор. ) - person bobince; 17.09.2010

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

person Marcus Stade    schedule 17.09.2010

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

eval({....}) --- this will get an error
eval('({....})')---eval string as a function
person wanin.lezu    schedule 17.09.2010
comment
Вы пытались показать разницу между eval("{}") и eval("({})") и случайно забыли кавычки? Описания каждого случая некорректны, если вы это исправите. Если нет, то этот ответ не имеет отношения к вопросу. Ответ также не объясняет, почему один синтаксис неверен по сравнению с другим и как eval связан со всем этим. - person Sebastian Simon; 02.07.2020