ECMAScript 2017: EscapeSequence в StringLiteral

Приведенные ниже выдержки относятся к ECMAScript 2017.

10.1 Исходный текст, синтаксис

Escape-последовательности, такие как \u000A, не будет интерпретироваться как терминаторы строки (т.е. новые строки):

В строковых литералах, литералах регулярных выражений, литералах шаблонов и идентификаторах любая кодовая точка Unicode также может быть выражена с помощью escape-последовательностей Unicode, которые явно выражают числовое значение кодовой точки. В комментарии такая escape-последовательность фактически игнорируется как часть комментария.

ECMAScript отличается от языка программирования Java поведением escape-последовательностей Unicode.

Если escape-последовательность Unicode \u000A встречается в строковом литерале в Java-программе, она интерпретируется как терминатор строки, что недопустимо в строковом литерале.

Экранирующая последовательность Unicode, встречающаяся в строковом литерале в программе ECMAScript, всегда вносит свой вклад в литерал и никогда не интерпретируется как терминатор строки или как кодовая точка, которая может завершать строковый литерал.

11.8.4 Строковые литералы

Кодовые точки могут отображаться как escape-последовательности в строковых литералах, за исключением обратного солидуса (\).

Строковый литерал представляет собой ноль или более кодовых точек Unicode, заключенных в одинарные или двойные кавычки. Кодовые точки Unicode также могут быть представлены escape-последовательностью. Все кодовые точки могут появляться буквально в строковом литерале, за исключением кодовых точек закрывающей кавычки, U+005C (ОБРАТНОЕ СОЛИДУС), U + 000D (ВОЗВРАТ КАРРИЖА), U+2028 (РАЗДЕЛИТЕЛЬ ЛИНИИ), U+2029 (РАЗДЕЛИТЕЛЬ ПАРАГРАФОВ), и U+000A (LINE FEED). Любые кодовые точки могут появляться в виде escape-последовательности.

Вопросы

  1. Как может произойти escape-последовательность внутри строкового литерала, если \ не допускается (11.8.4)?
  2. 11.8.4. утверждает, что кодовые точки могут быть представлены как escape-последовательности. 10.1 утверждает, что escape-последовательность \u000A внутри строкового литерала не интерпретируется как line terminator, Эти два кажутся противоречивыми. Если он не интерпретируется как разрыв строки внутри строкового литерала, то как он интерпретируется (если вообще)?

1 ответ

Решение

Как может произойти escape-последовательность внутри строкового литерала, если \ не разрешено (11.8.4)?

Я думаю, что ключевой частью этого раздела является "появиться буквально", что говорит о том, что \ в строке литерал не переводится в обратную косую черту в самой получаемой строке. Это не говорит, что обратные слеши запрещены, это говорит о том, что они "не появляются буквально".

10.1 утверждает, что escape-последовательность \uu000A внутри строкового литерала не интерпретируется как терминатор строки.

Вы пропустили предыдущую часть этой цитаты "всегда способствует буквальному". \u000A вполне допустимо, и действительно добавляется к содержанию строки. Этот код говорит, что он не рассматривается как терминатор строки в смысле лексической грамматики. Это говорит о том, что

var foo = "one\u000Atwo";

разрешено, хотя

var foo = "one
two";

это синтаксическая ошибка Оба пытаются использовать кодовую точку новой строки между словами, но первое допустимо, потому что на самом деле это не рассматривается как терминатор строки с точки зрения лексера.

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