Javascript:奇怪的比较行为
Javascript: strange comparison behaviour
如果我在FireBug控制台中执行以下代码片段,它会以某种方式打印surprise!
:
['surprise!', 'boring'][Number(0=="")]
但是为什么?
UPD
对不起,人们,这是一个笑话!杰尔是第一个注意到的人!昨天我在字符串中发现了一个零宽度空间,从那时起就很想找点乐子=(
引号之间有一个额外的、不可见的字符。
如果你输入这个,你会变得"无聊",因为 0==" 计算结果为 true,Number(true( 计算结果为 1。
粘贴这两个并观察不同的输出:
0==""
输出假
0==""
输出为真
我唯一更改的是删除""
之间的字符。
0==""
是false
(因为字符串中有非打印字符(,Number(false)
是0
的(根据规范的第 34 页(,"惊喜"是数组的第 0 个索引。
ES5 11.9.3 ==
运算符
如果 Type(x( 是 Number 且 Type(y( 是 String, 返回比较结果 x == ToNumber(y(。
和
StringNumericLiteral 的 MV ::: [empty] 为 0。
因此,0==""
返回0 == ToNumber("")
这是0 == 0
哪个是真的。
根据==
转换规则0==""
true
15.7.1.1 数字(值(调用 ES5 9.3 到数字toNumber(true) === 1
["suprize!", "boring"][1]
返回"boring"
这显然是不正确的。
为什么是正确的?因为
"".charCodeAt(0) === 8203
文本不是空字符串。字符串中的空格为零。
现在,如果我们回到ES5 11.9.3 ==
运算符,我们看到
如果语法无法将字符串解释为 StringNumericLiteral 的扩展
这意味着
-
0==""
-
0==NaN
-
false
-
toNumber(false) === 0
-
Number(0=="") === 0
-
["suprize!", "boring"][0] === "suprize!"
['surprise!', 'boring'][Number(0=="")]
将返回"无聊"作为您的代码:
Number(0=="") //returns true
但是你的代码是不同的,你的文本中有一个不可见的字符,这就是返回 false 的原因。
如果正确编写代码,将返回 true,结果将按预期boring
。
但是,如果复制并粘贴您的代码,将返回 false,这就是为什么您在 " 之间有一个字符(您可以使用键盘或 ".length 进行检查(
所以你的代码将返回 false,这将是 0,然后返回"惊喜!
你在欺骗男人:P
['surprise!', 'boring'][Number(0=="")]
"".length //returns 1 ;)
"" != "" // OH GOD THIS IS TRUE :P
控制台中运行它时我会很无聊console.log(['surpeise!','boring'][Number(0=="(](
- 无法比较javascript变量
- 比较javascript中的浮动并更改最高浮动的颜色
- 比较Javascript中的两个字符串时出错
- 比较javascript数组中的数值
- 比较 JavaScript 中的值
- 如何比较 JavaScript 格式为 2011-jan-21 的两个日期
- 是否有必要使用 === 来比较 Javascript 中的字符串,或者 == 就足够了
- 使用Jquery比较Javascript中的两个列表/表
- 比较javascript中的两个数组
- 如何在单元测试中比较JavaScript对象
- 比较javascript/jquery中的两个字符串
- 比较Javascript中的两个数组
- 比较javascript中的数组时出错
- 比较javascript中的函数指针
- 无法比较 javascript 数组中的两个值
- 如何仅针对某些属性比较 JavaScript 中的对象
- 循环并比较JavaScript对象
- 比较 JavaScript 中的变量
- 比较Javascript/Jquery中的确切结果
- 比较 JavaScript 日期对象