標準には null ターミネータが存在しないため、ブラウザがすべきことは、文字列とその長さを別々に追跡することです。(文字列は長さのある単なるオブジェクトです)。
Chromeが行っているように見えること (私はこれについてあなたの言葉を借りています) は、\0 で終了する標準の C 文字列関数を使用することです。あなたの質問の 1 つに答えるには: はい、これは Chrome のalert()
関数処理のバグです。
正式には、仕様は次のように述べています。
文字列リテラルは、一重引用符または二重引用符で囲まれた 0 個以上の文字です。各文字は、エスケープ シーケンスで表すことができます。終了引用符、バックスラッシュ、キャリッジ リターン、行区切り、段落区切り、およびライン フィードを除くすべての文字は、文字列リテラルにそのまま表示できます。任意の文字がエスケープ シーケンスの形式で表示される場合があります。
また:
文字列リテラルは、文字列型の値を表します。リテラルの文字列値 (SV) は、文字列リテラルのさまざまな部分が寄与する文字値 (CV) で記述されます。
そしてNULバイトに関して:
EscapeSequence :: 0 [lookahead ∉ DecimalDigit] の CV [Character Value] は <NUL> 文字 (Unicode 値 0000) です。
したがって、NUL バイトは単純に「まだ別の文字値」であるべきであり、SV (文字列値) で終了する可能性のある他の言語とは対照的に、特別な意味はありません。
(有効な)「文字列単一文字エスケープ シーケンス」の参照については、ECMAScript 言語仕様のセクション 7.8.4を参照してください。パラグラフの最後に、前述のエスケープ シーケンスをリストした表があります。
Javascript エンジンを作成しようとしている人は、おそらくこれから学ぶことができるでしょう: C/C++ 文字列関数を使用しないでください。:)