Это допустимая автоматическая вставка точки с запятой?

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

0 ответов

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