Какое поведение ввода ввода {A: 1} дает 1 и {A: 1, B: 2}, давая ошибку в консоли JavaScript?
-
03-10-2019 - |
Вопрос
Следующее покажет в 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}
давая ошибку? В Руби они вернутся так же, как вы его определили.
Решение
Вторая строка дает вам SyntaxError
поскольку {
токен в начале этого вызывает двусмысленность, парсер относится к этому, как если бы это было Заблокировать выписку, не начало объекта литерала.
Например, действительное заявление блока:
{ foo: 'bar' }
Вышесказанное выглядит как объект буквальный, но это не так, потому что код оценивается в Оператор контекст.
Он будет проанализирован как блок, который содержит помеченное утверждение (foo
), а затем оператор выражения ('bar'
).
Чтобы убедиться, что вы используете грамматику литерала объекта, вы можете обернуть его скобками (также известными как оператор группы):
({ foo: 'bar' })
Оператор группировки может принимать только выражения, поэтому нет неоднозначности.
Смотрите также:
Другие советы
Я не на 100% положительный, но то, что я думаю, что во второй строке вы определяете блок, а не объект. Таким образом, ошибка разбора приходит, когда анализатор достигает запятой, поскольку он ожидает полуваро-цвет. Метки ярлыки являются ярлыками, как в операторе Goto или Switch. Я надеюсь, что это объяснение имеет смысл.
Консоль делает как Eval («Ввод»)
eval({....}) --- this will get an error
eval('({....})')---eval string as a function