2012-01-19 61 views
5

如果我执行的萤火下面的代码片段安慰它在某种程度上打印surprise!的Javascript:比较奇怪的行为

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

但是,为什么?

UPD

对不起的人,这是一个笑话!杰尔是第一个注意到的人!昨天,我发现了一个字符串ZERO WIDTH SPACE,此后便诱惑了一些乐趣=)

+0

你的意思是'surprize!'对? – Jere

+0

@micha,介意'==',而不是== == – newtover

+0

不,他的萤火虫识别错误并修复它们。 – shift66

回答

9

您的报价之间有一个额外的不可见字符。

如果输入了这一点,你会得到“无聊”,因为0 ==“”计算结果为真,编号是(true)演算值为1

粘贴这两个,看不同的输出:

0=="​" 

输出

0=="" 

输出

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

+0

+1。有一会儿,我以为控制台被窃听了。太好了! – cheeken

+0

什么作弊... – Raynos

+1

是的,杰尔是对的。复制和粘贴线,然后用键盘箭头移动,你会发现一个额外的停止。这可能是非常小的空间 – welldan97

8

0=="​"false因为你有串)在非打印字符,Number(false)0(按page 34 of the spec ),“惊喜”是数组的第0个索引。

+0

你应该得到更多的选票我的朋友 – Joe

4

ES5 11.9.3 The == operator

如果Type(x)是数目和类型(y)为字符串,返回 比较X == ToNumber(Y)的结果。

StringNumericLiteral的MV ::: [空]是0

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

通过==转换规则0==""true

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

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

为什么它是正确的?由于

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

你的字符串是不是空字符串。你的字符串中有一个zero width space

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

如果语法不能解释字符串作为StringNumericLiteral

的扩展这意味着

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

['surprise!', 'boring'][Number(0=="​")]将返回 '无聊' becouse代码:

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

但你的代码是diferent,你有一种无形的字符你的文字,这就是为什么返回false。

如果您正确编写代码将返回true,结果将按boring预期。

但是,如果复制和粘贴代码,将返回false,这就是为什么你的“”(你可以检查使用键盘或“”。长度)

因此您的代码将返回false一个char ,那将是0然后返回'惊喜!'

你就是在欺骗人:P

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

"​".length //returns 1 ;) 

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

我得到无聊时在控制台 的console.log跑这([ '!surpeise', '无聊'] [数(0 == “”)] )