Ответ 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/С++.:)