如果我在FireBug控制台中执行以下代码段,它会以某种方式打印surprise!
:
['surprise!', 'boring'][Number(0=="")]
但为什么?
UPD
对不起,伙计们,这是个玩笑!杰尔是第一个注意到的人!昨天我在一个字符串中找到了一个ZERO WIDTH SPACE,从那时起就有了一些乐趣=)
答案 0 :(得分:9)
你的引号之间有一个额外的,不可见的字符。
如果你输入这个,你会得到'无聊',因为0 ==“”评估为真,数字(真)评估为1。
粘贴这两个并观察不同的输出:
0==""
输出 false
0==""
输出 true
我唯一改变的是删除""
之间的字符。
答案 1 :(得分:8)
0==""
为false
(因为字符串中有非打印字符),Number(false)
为0
(按照{ {3}}),“surprise”是数组的第0个索引。
答案 2 :(得分:4)
如果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 == “”)])