Я возился с 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
), и это меняет значение первого {}
.