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-последовательности.
Вопросы
- Как может произойти escape-последовательность внутри строкового литерала, если
\
не допускается (11.8.4)? - 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";
это синтаксическая ошибка Оба пытаются использовать кодовую точку новой строки между словами, но первое допустимо, потому что на самом деле это не рассматривается как терминатор строки с точки зрения лексера.