如果我执行的萤火下面的代码片段安慰它在某种程度上打印surprise!
:的Javascript:比较奇怪的行为
['surprise!', 'boring'][Number(0=="")]
但是,为什么?
UPD
对不起的人,这是一个笑话!杰尔是第一个注意到的人!昨天,我发现了一个字符串ZERO WIDTH SPACE,此后便诱惑了一些乐趣=)
如果我执行的萤火下面的代码片段安慰它在某种程度上打印surprise!
:的Javascript:比较奇怪的行为
['surprise!', 'boring'][Number(0=="")]
但是,为什么?
UPD
对不起的人,这是一个笑话!杰尔是第一个注意到的人!昨天,我发现了一个字符串ZERO WIDTH SPACE,此后便诱惑了一些乐趣=)
0==""
是false
(因为你有串)在非打印字符,Number(false)
是0
(按page 34 of the spec ),“惊喜”是数组的第0个索引。
你应该得到更多的选票我的朋友 – Joe
如果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!"
['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
我得到无聊时在控制台 的console.log跑这([ '!surpeise', '无聊'] [数(0 == “”)] )
你的意思是'surprize!'对? – Jere
@micha,介意'==',而不是== == – newtover
不,他的萤火虫识别错误并修复它们。 – shift66