为什么在字符串中任意放置null终止符会终止它呢?

时间:2012-09-26 14:25:34

标签: javascript string terminator

空字符或空终止符(\0)用于终止连续的字符序列。我发现在C中,我可以将字符添加到随机位置的字符串中,字符串将从该点切断。例如:

char * s = "Hello\0World";

将导致s等于字符串"Hello"。但是,在JavaScript中,情况并非如此:

var s = "Hello\0World";

以上内容无法按预期工作。 s将等于字符串"HelloWorld"

为什么这不起作用?

3 个答案:

答案 0 :(得分:9)

JavaScript不使用NULL终止字符串,而C表示。

通过分别跟踪字符和长度来存储Javascript字符串,而不是试图假设NULL标记字符串的结尾。

答案 1 :(得分:4)

C字符串仍然指向存储器中存储“Hello \ 0World”的地址,只有大多数字符串处理函数认为字符串的结尾为0。对于某些函数,您必须传递一个字符串长度参数,但大多数只是读取,直到找到空字节。在内存中,字符串实际上是“Hello \ 0World \ 0”。

JavaScript引擎无法通过查找空字节来确定字符串长度,因为在这种情况下,您无法在字符串中包含nullbyte。在规格中可能有一些相关的东西。引擎必须分别存储字符串的长度,然后在访问字符串时从内存中读取多个字符。

如何正确地解析和存储缓冲区的大小是脚本语言通常试图向用户隐藏的东西。这是编写脚本的目的的一半,不要求程序员担心将0添加到创建的字符缓冲区和/或单独存储字符串长度,以便字符串处理函数不会在缓冲区外打印一堆随机字符一个nullbyte ......

那么JavaScript字符串究竟是如何表现的?我不知道,可能由引擎来深入描述其属性。只要您按照规范说明与对象接口,就可以以任何方式实现,使用缓冲区和长度的结构,使用0的转换字符,使用链接的字符列表等等。

答案 2 :(得分:2)

在Javascript中,String中的NULL字节只是字符串中的NULL字节。 如果要截断字符串

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

但在这种情况下我认为不需要打扰空字节:)