8

ヌル文字またはヌルターミネータ(\0)は、連続する文字シーケンスを終了するために使用されます。Cでは、文字をランダムな位置で文字列に追加でき、その点から文字列が切り取られることがわかりました。例えば:

char * s = "Hello\0World";

文字列とs等しくなります"Hello"。ただし、JavaScriptでは、これは当てはまりません。

var s = "Hello\0World";

上記は期待どおりに機能しません。s文字列と等しくなります"HelloWorld"

なぜこれが機能しないのですか?

4

3 に答える 3

12

JavaScriptはNULLで終了する文字列を使用しませんが、Cは使用します。

Javascript文字列は、NULLが文字列の終わりを示していると想定するのではなく、文字と長さを別々に追跡することによって保存されます。

于 2012-09-26T14:28:48.387 に答える
3

C文字列は、「Hello \ 0World」が格納されているメモリ内のアドレスを指しますが、ほとんどの文字列処理関数は文字列の0の終わりを考慮します。一部の関数では、文字列の長さの引数を渡す必要がありますが、ほとんどの場合、ヌルバイトが見つかるまで読み取るだけです。メモリ内の文字列は、実際には「Hello \ 0World\0」です。

JavaScriptエンジンは、nullバイトを探すことによって文字列の長さを決定することはできません。そのような場合、文字列内にnullbyteを含めることはできないからです。スペックにはおそらくそれについて何かがあります。エンジンは、代わりに文字列の長さを個別に保存し、文字列にアクセスするたびにその数の文字をメモリから読み取る必要があります。

また、バッファのサイズを適切に解析して保存する方法は、スクリプト言語が通常ユーザーから隠そうとするものです。これはスクリプトの目的の半分です。プログラマーが0作成された文字バッファーに追加したり、文字列の長さを個別に保存したりする必要がないため、文字列処理関数がバッファーの外にランダムな文字の束を出力してnullバイトを探したりすることはありません...

では、JavaScript文字列はどのように動作するのでしょうか。わかりませんが、そのプロパティを詳細に説明するのはおそらくエンジン次第です。仕様にあるようにオブジェクトとインターフェイスする限り、バッファと長さの構造体、0の変換文字、文字のリンクリストなどを使用して、どのような方法でも実装できます。

于 2012-09-26T14:35:32.003 に答える
2

Javascriptでは、文字列NULLのバイトは単にNULL文字列のバイトです。文字列を切り捨てたい場合

var s = "Hello\0World".split("\0").shift();

しかし、この場合、ヌルバイトを乱す必要はないと思います:)

于 2012-09-26T14:33:34.463 に答える