Javascript:奇怪的比较行为
如果我在FireBug控制台中执行以下代码段,它会以某种方式打印出Javascript:奇怪的比较行为,javascript,Javascript,如果我在FireBug控制台中执行以下代码段,它会以某种方式打印出惊喜: ['surprise!', 'boring'][Number(0=="")] 但是为什么呢 UPD 对不起,大家,这是个玩笑!杰尔是第一个注意到的人!昨天我在一个字符串中找到了一个字符串,从那以后我一直想找点乐子"是false(因为字符串中有一个非打印字符,Number(false)是0(根据),而“惊喜”是数组的第0个索引。在引号之间有一个额外的、不可见的字符 如果你把这个输入出来,你会觉得很无聊,因为0==“”的
惊喜代码>:
['surprise!', 'boring'][Number(0=="")]
但是为什么呢
UPD
对不起,大家,这是个玩笑!杰尔是第一个注意到的人!昨天我在一个字符串中找到了一个字符串,从那以后我一直想找点乐子"
是false
(因为字符串中有一个非打印字符,Number(false)
是0
(根据),而“惊喜”是数组的第0个索引。在引号之间有一个额外的、不可见的字符
如果你把这个输入出来,你会觉得很无聊,因为0==“”的计算结果为true,Number(true)的计算结果为1
粘贴这两个并观察不同的输出:
0==""
输出<强>假强>
0==""
输出<强>真强>
0==""
我唯一更改的是删除之间的字符
如果类型(x)是数字,类型(y)是字符串,
返回比较结果x==ToNumber(y)
及
StringNumericLiteral::[empty]的MV为0
因此0==“”
返回0==ToNumber(“”
这是0==0
这是真的
根据==
转换规则0==”
为true
调用toNumber(true)==1
而[“suprize!”,“boring”][1]
返回的“boring”
,这显然是不正确的
为什么是正确的?因为
”“.charCodeAt(0)==8203
字符串文字不是空字符串。字符串中有一个
现在如果我们回去看看
如果语法无法将字符串解释为StringNumericLiteral的扩展
也就是说
0==”
0==NaN
false
toNumber(false)==0
Number(0==”)==0
[“suprize!”,“无聊”][0]=“suprize!”!“
[“惊喜!”,“无聊”][数字(0==””)
将返回“无聊”,因为您的代码:
Number(0=="") //returns true
但代码是不同的,文本中有一个不可见的字符,这就是返回false的原因
如果正确编写代码,则返回true,结果将如预期的那样令人厌烦
但是如果复制并粘贴代码,将返回false,这就是为什么在“(您可以使用键盘或”“.长度)
因此,您的代码将返回false,即0,然后返回“惊奇!”
你在欺骗男人:p
['surprise!', 'boring'][Number(0=="")]
"".length //returns 1 ;)
"" != "" // OH GOD THIS IS TRUE :P
当我在控制台中运行这个时,我感到很无聊
console.log(['surpeise!','boring'][Number(0==“”)])@micha,注意==
,而不是==
不,他的firebug识别错误并修复它们。我为参与感到羞愧……至少我想我们学到了一些东西minor@Jere,对不起,我不认为你受到了太大的伤害。现在至少你知道在调试过程中可以在哪里找到。真的。你是如何进入零宽度空间的首先?是的,Jere是对的。复制并粘贴行到那里,然后用键盘箭头移动,你会注意到一个额外的停止。这可能是非常小的空间。我最初打算键入与其他人相同的答案…但注意到了黑魔法。:)不错的地方。当我将它粘贴到chrome控制台中并返回时,我确实认为它是错误的0.尽管如此,却从未有过细枝:(