Это допустимая автоматическая вставка точки с запятой?
Я возился с JavaScript и обнаружил поведение, которое не понимаю. Проблема, похоже, связана с автоматической вставкой точек с запятой ( ASI), но, на мой взгляд, ASI работает неправильно. Следующий код был протестирован с node v8.10
и с помощью консоли инструментов разработчика Google Chrome (версия 73.0.3683.86 (официальная сборка) (64-разрядная версия)).
> 0 == {}
false
> {} == 0
...
Три точки означают Uncaught SyntaxError: Unexpected token ==
(взято из вывода консоли разработчика Chrome). Похоже, это объясняется тем, что ASI фактически превратила его в {;} == 0
, но из чтения спецификаций (ссылка выше), это не должно делать это. Я неправильно понял спецификации?
Есть некоторые забавные ситуации, которые это вызывает, и некоторые странные тоже. Например, {} + 4
оценивается до 4, потому что это {;} + 4
или просто +4
, Но, 4 + {}
является '4[object Object]'
, И, странно:
> {} + 4 + {}
'[object Object]4[object Object]'
Не стало {;} + 4 + {}
, который будет таким же, как 4 + {}
теперь он фактически принял первый {}
как объект, а не блок!! Правый маркер имеет значение:
> {} + 4 + {} + 4
'4[object Object]4'
Теперь первый {}
был снова интерпретирован как пустой блок. Более того,
> {} + {}
'[object Object][object Object]'
> {} + {} + 4
NaN
Поведение второй строки снова похоже на ASI, потому что +{}
, или же Number({})
, оценивает NaN
(Первый {}
снова интерпретируется как пустой блок.)
дополнительный смешной код:
> {a:3}.a + 2
... // Uncaught SyntaxError: Unexpected token .
> ({a:3}.a + 2)
5
На этот раз первый фактически становится пустым блоком с меткой a
!
Я не ожидал, что в этих примерах произойдет ASI, так как это уже должно быть (я думаю) правильное создание грамматики. И кажется странным, как мы можем продолжать чередовать самый правый токен ({} + 4 + {}
а также {} + 4 + {} + 4
) и это меняет смысл первого {}
,