Javascript:奇怪的比较行为

时间:2012-01-19 14:10:41

标签: javascript

如果我在FireBug控制台中执行以下代码段,它会以某种方式打印surprise!

['surprise!', 'boring'][Number(0=="​")]

但为什么?

UPD

对不起,伙计们,这是个玩笑!杰尔是第一个注意到的人!昨天我在一个字符串中找到了一个ZERO WIDTH SPACE,从那时起就有了一些乐趣=)

5 个答案:

答案 0 :(得分:9)

你的引号之间有一个额外的,不可见的字符。

如果你输入这个,你会得到'无聊',因为0 ==“”评估为真,数字(真)评估为1。

粘贴这两个并观察不同的输出:

0=="​"

输出 false

0==""

输出 true

我唯一改变的是删除""之间的字符。

答案 1 :(得分:8)

0=="​"false因为字符串中有非打印字符),Number(false)0(按照{ {3}}),“surprise”是数组的第0个索引。

答案 2 :(得分:4)

ES5 11.9.3 The == operator

  

如果Type(x)是Number而Type(y)是String,   返回比较结果x == ToNumber(y)。

  

StringNumericLiteral ::: [empty]的MV为0。

所以0==""会返回0 == ToNumber("") 0 == 0,这是真的。

==转化规则0==""true

ES5 15.7.1.1 Number ( value )调用ES5 9.3 toNumber toNumber(true) === 1

["suprize!", "boring"][1]返回"boring",这显然不正确。

为什么这是正确的?因为

"​".charCodeAt(0) === 8203

您的字符串文字不是空字符串。您的字符串中有zero width space

现在,如果我们回到ES5 11.9.3 == operator,我们会看到

  

如果语法不能将String解释为StringNumericLiteral的扩展

这意味着

  • 0==""
  • 0==NaN
  • false
  • toNumber(false) === 0
  • Number(0=="") === 0
  • ["suprize!", "boring"][0] === "suprize!"

答案 3 :(得分:1)

['surprise!', 'boring'][Number(0=="​")]会因您的代码而返回'无聊':

Number(0=="​") //returns true

但是你的代码不同,你的文本中有一个不可见的字符,这就是为什么返回false。

如果正确编写代码,则返回true,结果将为boring,如预期的那样。

但是如果复制并粘贴你的代码,将返回false,这就是你在“”之间有一个字符的原因(你可以用键盘或“。”检查)

所以你的代码将返回false,那将是0然后返回'surprise!'

你是在欺骗男人:P

['surprise!', 'boring'][Number(0=="​")]

"​".length //returns 1 ;)

"​" != "" // OH GOD THIS IS TRUE :P

答案 4 :(得分:0)

在控制台中运行时,我感到很无聊 的console.log([ '惊喜!', '镗孔'] [数(0 == “”)])