如果我在浏览器控制台中执行以下行
!![] //--- returns true
!!0 //--- returns false
我得到[]
和0
有不同的布尔值。
我不明白为什么
[] == 0 //--- returns true
返回true
。
我错过了什么?
答案 0 :(得分:5)
请记住,数组是对象,0是数字。
正如“user2864740”告诉..
1)当你做
时!![] //--- returns true
!!0 //--- returns false
您正在执行所谓的“ToBoolean”转换
数
如果参数为+ 0,-0或NaN,则结果为false;否则 结果是真的。
对象(我们的[])
永远是真的
2)但是当你使用==时,你执行所谓的“平等比较”
https://es5.github.io/#x11.9.3
这里有点复杂,但要明白发生了什么,你必须记住==做一个类型强制(所以你可以比较橙子和苹果:))
首先编译器将[]转换为某种原始类型。
如果Type(x)是String或Number而Type(y)是Object,则返回 比较的结果x == ToPrimitive(y)。
ToPrimitive如何工作是文章的问题:),但很容易记住,closet基元类型到数组是字符串。数组将转换为空字符串。
[]。toString()===“”
所以现在我们需要比较空字符串和数字0
"" == 0 // true
嗯。这是真的。但那是为什么呢?请记住,当您与“Equality Comparison”数字和字符串
进行比较时
- 如果Type(x)为Number且Type(y)为String,则返回比较结果x == ToNumber(y)。
醇>
所以让我们尝试将空字符串转换为数字
Number("") === 0
最后
0 === 0
我希望这能解释一些事情:)
答案 1 :(得分:1)
JavaScript可能会将数组转换为数字:
!!Number([]) // false
Number([]) == 0 // true