Нулевой символ в строках

Рассмотрим эту строку:

var s = "A\0Z";

Его длина равна 3, как указано s.length. Используя console.log, вы можете видеть, что строка не вырезана, а s[1] - "" и s.charCodeAt(1) - 0.

Когда вы предупреждаете об этом в Firefox, вы увидите AZ. Когда вы сообщаете об этом в Chrome/Linux с помощью alert(s), \0 завершает строку, и вы видите A.

Мой вопрос: какие должны браузеры и механизмы Javascript? Является ли Chrome ошибкой здесь? Есть ли документ, определяющий, что должно произойти?

Поскольку это вопрос о стандарте, необходима ссылка.

Ответы

Ответ 1

Что должен делать браузер, так это отслеживать длину строки и ее длину отдельно, поскольку в стандарте нет нулевых терминаторов. (Строка - это просто объект с длиной).

Что делает Chrome (я беру ваше слово для этого), используют стандартные функции строки C, которые заканчиваются на \0. Чтобы ответить на один из ваших вопросов: Да, это для меня представляет собой ошибку в обработке Chrome функции alert().

Формально спецификация говорит:

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

также:

Строковый литерал обозначает значение типа String. Значение String (SV) литерала описывается в терминах значений символа (CV), предоставляемых различными частями строкового литерала.

И в отношении байта NUL:

CV [Значение символа] EscapeSequence:: 0 [lookahead ∉ DecimalDigit] является символом <NUL> (значение Unicode 0000).

Поэтому байт NUL должен быть просто "еще одним символьным значением" и не имеет особого значения, в отличие от других языков, где он может заканчивать SV (значение String).

Для справки (действительных) "Строковые последовательности одиночного символа" смотрите раздел спецификации ECMAScript 7.8.4. В конце абзаца приведена таблица, в которой перечислены вышеупомянутые escape-последовательности.

То, что кто-то, кто хочет написать механизм Javascript, мог бы узнать из этого: Не используйте строковые функции C/С++.:)

Ответ 2

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

Ответ 3

Вы задаете вопрос о неравномерном (в браузере) поведении метода alert(), поэтому он не имеет ничего общего с объектом Script и спецификацией ECMAscript, как есть, о том, как alert() показывает объект String.

alert() - это метод объекта Window, а ECMAscript не определяет его (он только сообщает, что среда хоста может предоставлять глобальные объекты в качестве объекта окна).

Но это бывает спецификация w3c, определяющая поведение alert(), к сожалению, она очень скудная и не работает "Не указывайте, как должны отображаться сообщения со встроенными нулевыми символами.

Таким образом, это поведение, как и любые другие детали, не указанные в спецификации, не учитываются для собственных реализаций браузеров.