20

考虑这个字符串:

var s = "A\0Z";

它的长度为 3,由 给出s.length。使用console.log您可以看到字符串没有被剪切,即s[1]is""s.charCodeAt(1)is 0

当您在 Firefox 中提醒它时,您会看到AZ. 当您在 Chrome/Linux 中使用 警告它时alert(s)\0终止字符串并且您会看到A.

我的问题是:浏览器和 Javascript 引擎应该做什么?Chrome 在这里有问题吗?是否有文件定义应该发生的事情?

由于这是关于标准的问题,因此需要参考。

4

3 回答 3

19

浏览器应该做的是分别跟踪字符串及其长度,因为标准中不存在空终止符。(字符串只是一个有长度的对象)。

Chrome似乎在做的(我相信你的话)是使用标准的 C 字符串函数,它在 \0 处终止。回答您的一个问题:是的,这对我来说构成了 Chrome 处理该alert()功能的错误。

正式的规范说:

字符串文字是用单引号或双引号括起来的零个或多个字符。每个字符都可以用一个转义序列来表示。除了右引号字符、反斜杠、回车、行分隔符、段落分隔符和换行符之外,所有字符都可以按字面意思出现在字符串文字中。任何字符都可能以转义序列的形式出现。

还:

字符串文字代表 String 类型的值。文字的字符串值 (SV) 是根据字符串文字的各个部分贡献的字符值 (CV) 来描述的。

关于 NUL 字节:

EscapeSequence :: 0 [lookahead ∉ DecimalDigit] 的 CV [Character Value] 是 <NUL> 字符(Unicode 值 0000)。

因此,一个 NUL 字节应该只是“另一个字符值”并且没有特殊含义,这与它可能以 SV(字符串值)结尾的其他语言相反。

有关(有效)“字符串单字符转义序列”的参考,请查看ECMAScript 语言规范第 7.8.4 节。段落末尾有一个表格,列出了上述转义序列。

打算编写 Javascript 引擎的人可能会从中学到:不要使用 C/C++ 字符串函数。:)

于 2012-12-04T08:26:15.100 回答
9

Javascript 像对待任何其他字符一样处理空字符,您的问题是如何在 cosole 或警报中显示它,它在不同的浏览器中有所不同,对此没有标准,所以 chrome 是可以的。

于 2012-12-04T08:32:44.440 回答
3

您正在询问alert()方法的非统一(跨浏览器)行为,因此它与 Script 对象和 ECMAscript 规范无关,它与如何alert()显示 String 对象有关。

alert()Window对象的一个​​方法,ECMAscript 没有定义它(它只是告诉宿主环境可以提供全局对象作为窗口对象)。

但它恰好是一个定义alert()行为的 w3c 规范,不幸的是它非常简陋,并且没有提供任何关于如何显示嵌入空字符的消息的提示。

因此,与规范中未指定的任何其他细节一样,此行为被浏览器自己的实现所遗漏。

于 2012-12-04T08:55:09.050 回答