考虑这个字符串:
var s = "A\0Z";
它的长度为 3,由下式给出s.length
. Using console.log
你可以看到绳子没有被切断s[1]
is ""
and s.charCodeAt(1)
is 0
.
当你在 Firefox 中提醒它时,你会看到AZ
。当您在 Chrome/Linux 中使用以下命令提醒它时alert(s)
, the \0
终止字符串,你会看到A
.
我的问题是:什么should浏览器和Javascript引擎做什么? Chrome 有 bug 吗?是否有文件定义应该发生什么?
由于这是一个关于标准的问题,所以需要一个参考。
什么浏览器should要做的是分别跟踪字符串及其长度,因为标准中不存在空终止符。 (字符串只是一个有长度的对象)。
什么铬seems要做的(我相信你的话)是使用以 \0 结尾的标准 C 字符串函数。回答你的一个问题:是的,这对我来说构成了 Chrome 处理中的一个错误alert()
功能。
规范的正式规定是:
字符串文字是用单引号或双引号括起来的零个或多个字符。每个字符可以由转义序列表示。除了结束引号字符、反斜杠、回车符、行分隔符、段落分隔符和换行符之外,所有字符都可以按字面意思出现在字符串文字中。任何字符都可以以转义序列的形式出现。
Also:
字符串文字代表 String 类型的值。文字的字符串值 (SV) 是根据字符串文字各个部分贡献的字符值 (CV) 来描述的。
关于 NUL 字节:
EscapeSequence :: 0 [lookahead ∉ DecimalDigit] 的 CV [字符值] 是 字符(Unicode 值 0000)。
因此,NUL 字节应该只是“又一个字符值”并且没有特殊含义,这与它可能以 SV(字符串值)结尾的其他语言相反。
有关(有效)“字符串单字符转义序列”的参考,请参阅ECMAScript 语言规范第 7.8.4 节 http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4。该段落末尾有一个表格,列出了上述转义序列。
打算编写 Javascript 引擎的人可能可以从中学到什么:不要使用 C/C++ 字符串函数。 :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)