20

次の文字列を検討してください。

var s = "A\0Z";

で与えられるように、その長さは 3s.lengthです。使ってみるとconsole.log、弦が切れていないのがs[1]わかります。""s.charCodeAt(1)0

Firefox で警告すると、 が表示されますAZ。を使用して Chrome/Linux で警告すると、文字列alert(s)\0終了し、 が表示されますA

私の質問は、ブラウザーと Javascript エンジンは何をすべきかということです。ここにChromeのバグがありますか?何が起こるべきかを定義する文書はありますか?

これは標準に関する質問なので、参照が必要です。

4

3 に答える 3

19

標準には 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++ 文字列関数を使用しないでください。:)

于 2012-12-04T08:26:15.100 に答える
9

Javascript は null 文字を他の文字と同じように扱います。あなたの質問は、それを cosole またはアラートで表示する方法です。ブラウザーによって異なります。これに関する標準はないため、chrome は問題ありません。

于 2012-12-04T08:32:44.440 に答える
3

メソッドの不均一な(ブラウザ間での)動作について質問しているalert()ため、Script オブジェクトと ECMAscript 仕様とは関係ありません。String オブジェクトをどのようにalert()表示するかについてです。

alert()Windowオブジェクトのメソッドであり、ECMAscript はそれを定義しません (ホスト環境がグローバル オブジェクトをウィンドウ オブジェクトとして提供する可能性があることを伝えるだけです)。

しかし、これはたまたま動作を定義する w3c 仕様でalert()あり、残念ながら非常に少なく、ヌル文字が埋め込まれたメッセージをどのように表示するかについてのヒントを提供していません。

したがって、この動作は、仕様で指定されていない他の詳細と同様に、ブラウザー独自の実装のために除外されています。

于 2012-12-04T08:55:09.050 に答える