Каково поведение ввода {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 они вернутся так же, как вы его определили.

Ответы

Ответ 1

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

Например, действительный оператор блока:

{ foo: 'bar' }

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

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

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

({ foo: 'bar' })

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

См. также:

Ответ 2

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

Ответ 3

консоль делает как eval ('you input')

eval({....}) --- this will get an error
eval('({....})')---eval string as a function