考虑这个字符串:
var s = "A\0Z";
其长度为3,由s.length
给出。使用console.log
,您可以看到字符串未被剪切,s[1]
为""
且s.charCodeAt(1)
为0
。
当您在Firefox中提醒它时,您会看到AZ
。当您使用alert(s)
在Chrome / Linux中提醒时,\0
会终止该字符串,您会看到A
。
我的问题是:什么应该浏览器和Javascript引擎呢?这里有Chrome车吗?是否有文件定义应该发生什么?
由于这是关于标准的问题,因此需要参考。
答案 0 :(得分:15)
浏览器应该做的是分别跟踪字符串及其长度,因为标准中没有空终止符。 (字符串只是一个有长度的对象)。
Chrome 似乎要做什么(我接受你的话)是使用终止于\ 0的标准C字符串函数。回答您的一个问题:是的,这对我来说构成了Chrome处理alert()
功能的错误。
规范正式说:
字符串文字是用单引号或双引号括起来的零个或多个字符。每个字符可以由转义序列表示。除了结束引号字符,反斜杠,回车符,行分隔符,段落分隔符和换行符之外,所有字符都可以按字面意思显示在字符串文字中。任何字符都可能以转义序列的形式出现。
此外:
字符串文字代表String类型的值。文字的字符串值(SV)是根据字符串文字的各个部分所贡献的字符值(CV)来描述的。
关于NUL字节:
EscapeSequence :: 0 [lookahead∉DecimalDigit]的CV [字符值]是< NUL>。字符(Unicode值0000)。
因此,NUL字节应该只是“又一个字符值”并且没有特殊含义,与其他可能结束SV(字符串值)的语言相反。
对于(有效)“String Single Character Escape Sequences”的参考,请查看ECMAScript Language spec section 7.8.4。该段末尾有一个表格,列出了上述逃逸序列。
有人想要编写Javascript引擎的人可能会从中学到:不要使用C / C ++字符串函数。 :)
答案 1 :(得分:6)
Javascript处理空字符就像任何其他字符一样,你的问题是如何在cosole或警告中显示它,它在不同的浏览器中有所不同,没有标准,所以chrome是可以的。
答案 2 :(得分:3)
你问的是alert()
方法的非统一(跨浏览器)行为,所以它与Script对象和ECMAscript规范没有任何关系,而是关于alert()
如何显示字符串对象。
alert()
是Window
对象的一种方法,ECMAscript没有定义它(它只告诉主机环境可以提供全局对象作为窗口对象)。
但它恰好是w3c spec that defines alert()
行为,遗憾的是它非常稀疏,并没有提供有关如何显示嵌入空字符的消息的任何提示。
因此,与规范中未指定的任何其他细节一样,此行为与浏览器自己的实现无关。