Грамматика JavaScript: индексация литералов объектов синтаксически запрещена?
Похоже, что в Chrome 63.0 и Firefox 58.0 добавление индекса к литералу объекта не позволяет проанализировать объект как объект.
{"a":"b"}
17:37:32.246 {a: "b"}
{"a":"b"}["a"]
17:37:36.578 VM288:1 Uncaught SyntaxError: Unexpected token :
Кто-нибудь может объяснить, почему парсер не разбирает это так, как я? (Я думаю, что в моей реализации спецификации должна быть ошибка...) Кажется, она не анализирует объект.
Окружение объекта в скобках приводит к синтаксически правильному выражению:
({"a":"b"})["a"]
17:42:03.993 "b"
2 ответа
Это связано с оценкой консоли {}
как блок вместо литерала объекта.
Этот вопрос похож на "Определение объекта JavaScript в консоли" и "Является ли запись объекта в фигурных скобках допустимой в любом выражении?" вопрос по Stackru.
Ключевая часть из спецификации:
ExpressionStatement
: [lookahead ∉ {{
,function
}]Expression ;
ПРИМЕЧАНИЕ. ExpressionStatement не может начинаться с открывающей фигурной скобки, поскольку это может сделать его неоднозначным с блоком. Кроме того, ExpressionStatement не может начинаться с
function
ключевое слово, потому что это может сделать его неоднозначным с FunctionDeclaration.
{"a":"b"}["a"]
- {}
определяется как тело или блок скобки, а не как объект. Давайте посмотрим на пример if
Скажите, вы можете иметь что-то вроде этого
if(condition) {
"a": "b"
}
Так что на самом деле вы получаете утверждение, как "a" : "b"
который недействителен.
({"a":"b"})["a"]
- ()
оценивает выражение внутри него, так {}
определяется как объект