Это допустимая автоматическая вставка точки с запятой? - PullRequest
1 голос
/ 12 апреля 2019

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

...