2012-09-26 44 views
7

空字符或空终止符(\0)将用于终止连续的字符序列。我发现在C中,我可以将字符添加到一个随机位置的字符串中,并从该位置切断字符串。例如:为什么不在字符串中任意放置空终止符会终止它?

char * s = "Hello\0World"; 

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

var s = "Hello\0World"; 

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

为什么不能正常工作?

+0

I认为Javascript不是C.所以字符串中的空字节只是一个字符串中的空字节。 –

+1

大多数语言都遵循Pascal将字符串表示为具有整数长度的数组(因此允许空字符)的传统。 C在这个意义上实际上是奇怪的。 – hugomg

回答

8

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

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

+0

JS用于字符串的是什么? – 0x499602D2

+0

它用'''将它们分开.... – Nanne

2

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

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

但在这种情况下,我认为这没有必要去打扰空字节:)

4

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

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

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

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