Javascript:奇怪的比较行为

Javascript:奇怪的比较行为,javascript,Javascript,如果我在FireBug控制台中执行以下代码段,它会以某种方式打印出惊喜: ['surprise!', 'boring'][Number(0=="​")] 但是为什么呢 UPD 对不起,大家,这是个玩笑!杰尔是第一个注意到的人!昨天我在一个字符串中找到了一个字符串,从那以后我一直想找点乐子​"是false(因为字符串中有一个非打印字符,Number(false)是0(根据),而“惊喜”是数组的第0个索引。在引号之间有一个额外的、不可见的字符 如果你把这个输入出来,你会觉得很无聊,因为0==“”的

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

['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.尽管如此,却从未有过细枝:(