空字符或空终止符 ( \0
) 用于终止连续的字符序列。我发现在 C 中,我可以将字符添加到随机位置的字符串中,并且字符串将从该点被切断。例如:
char * s = "Hello\0World";
将导致s
等于字符串"Hello"
。然而,在 JavaScript 中,情况并非如此:
var s = "Hello\0World";
以上将无法按预期工作。s
将等于字符串"HelloWorld"
。
为什么这不起作用?
空字符或空终止符 ( \0
) 用于终止连续的字符序列。我发现在 C 中,我可以将字符添加到随机位置的字符串中,并且字符串将从该点被切断。例如:
char * s = "Hello\0World";
将导致s
等于字符串"Hello"
。然而,在 JavaScript 中,情况并非如此:
var s = "Hello\0World";
以上将无法按预期工作。s
将等于字符串"HelloWorld"
。
为什么这不起作用?
JavaScript 不使用以 NULL 结尾的字符串,而 C 则使用。
Javascript 字符串是通过单独跟踪字符和长度来存储的,而不是试图假设 NULL 标记字符串的结尾。
C 字符串仍然指向内存中存储“Hello\0World”的地址,只是大多数字符串处理函数认为字符串的结尾为 0。对于某些函数,您必须传递一个字符串长度参数,但最简单的是读取直到找到空字节。在内存中,字符串实际上是“Hello\0World\0”。
JavaScript 引擎无法通过查找空字节来确定字符串长度,因为在这种情况下,您将永远无法在字符串中包含空字节。规格中可能有一些关于此的内容。引擎必须单独存储字符串的长度,然后在您访问字符串时从内存中读取那么多字符。
而如何正确解析和存储缓冲区的大小是脚本语言通常试图对用户隐藏的东西。这是脚本的一半目的,不需要程序员担心添加0
到创建的字符缓冲区和/或单独存储字符串长度,以便字符串处理函数不会在缓冲区之外打印一堆随机字符以寻找空字节......
那么 JavaScript 字符串究竟是如何表现的呢?我不知道,可能要靠引擎来深入描述它的属性。只要您像规范所说的那样与对象交互,它就可以以任何方式实现,使用缓冲区和长度的结构,使用 0 的翻译字符,使用字符的链接列表等......
在 JavascriptNULL
中,String 中的NULL
字节只是字符串中的字节。如果你想截断字符串
var s = "Hello\0World".split("\0").shift();
但在这种情况下,我认为它不需要打扰空字节:)