Грамматика 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"] - () оценивает выражение внутри него, так {} определяется как объект

Другие вопросы по тегам