Каково поведение ввода {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