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



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

char * s = "HelloWorld";

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

var s = "HelloWorld";

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

为什么这不起作用?

JavaScript 不使用以 NULL 结尾的字符串,而 C 则使用。

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

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

var s = "HelloWorld".split("").shift();

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

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

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

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

那么 JavaScript 字符串究竟是如何表现的呢?我不知道,可能由引擎来深入描述它的属性。只要你像规范所说的那样与对象接口,它就可以以任何方式实现,使用缓冲区和长度的结构,使用 0 的翻译字符,使用字符链表等......

相关内容

  • 没有找到相关文章

最新更新