web-dev-qa-db-ja.com

文字列のヌル文字

この文字列について考えてみましょう。

_var s = "A\0Z";
_

_s.length_で指定されるように、その長さは3です。 _console.log_を使用すると、文字列がカットされておらず、_s[1]_が_""_であり、s.charCodeAt(1)が_0_であることがわかります。

Firefoxでアラートを出すと、AZが表示されます。 Chrome/Linuxでalert(s)を使用してアラートを送信すると、_\0_が文字列を終了し、Aが表示されます。

私の質問は:shouldブラウザとJavascriptエンジンは何をするのですか? Chromeここにバグがありますか?何が起こるべきかを定義するドキュメントはありますか?

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

17
Denys Séguret

標準にはnullターミネータが存在しないため、ブラウザが行うべきことは、文字列とその長さを個別に追跡することです。 (文字列は長さのある単なるオブジェクトです)。

Chromeのようです(私はあなたの言葉をこれに取っています)は、終了する標準のC文字列関数を使用します\ 0で。あなたの質問の1つに答えるために:はい、これは私にとってChromeのalert()関数の処理のバグを構成します。

正式には仕様は次のように述べています。

文字列リテラルは、一重引用符または二重引用符で囲まれた0文字以上です。各文字は、エスケープシーケンスで表すことができます。終了引用文字、円記号、キャリッジリターン、行区切り文字、段落区切り文字、および改行を除いて、すべての文字が文字列リテラルで文字通り表示される場合があります。任意の文字がエスケープシーケンスの形式で表示される場合があります。

また:

文字列リテラルは、文字列型の値を表します。リテラルの文字列値(SV)は、文字列リテラルのさまざまな部分によって提供される文字値(CV)の観点から記述されます。

そして、NULバイトに関して:

EscapeSequence :: 0 [lookahead∉DecimalDigit]のCV [文字値]は<NUL>文字(Unicode値0000)です。

したがって、NULバイトは、SV(文字列値)を終了する可能性がある他の言語とは対照的に、単に「さらに別の文字値」であり、特別な意味を持たない必要があります。

(有効な)「文字列単一文字エスケープシーケンス」のリファレンスについては、 ECMAScript言語仕様セクション7.8.4 を参照してください。段落の最後に、前述のエスケープシーケンスをリストした表があります。

Javascriptエンジンの作成を目指している人は、おそらくこれから学ぶことができます。C/ C++文字列関数を使用しないでください。 :)

15
Gung Foo

Javascriptはヌル文字を他の文字と同じように扱います。あなたの質問はそれをコソールまたはアラートでどのように表示するかです。ブラウザによって異なります。これに関する標準はないので、chrome OKです。

6
dencey

alert()メソッドの(ブラウザ間での)不均一な動作について質問しているので、ScriptオブジェクトやECMAscript仕様とは関係なく、alert()がどのように表示されるかについてです。 Stringオブジェクト。

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

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

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

3
Nelson