有人可以向我解释为什么......(这是在Chrome控制台中)
null == false // false
!null == false // false
[]? '你好':'再见'//'你好'
[] ==是吗? '你好':'再见'//'再见'
我可以提出更多,但基本上javascript是如何得出这些结果的?
答案 0 :(得分:2)
JavaScript做了很多类型转换,如果不知道它就不明显(JavaScript equality transitivity is weird)。
!
NOT运算符,Boolean
函数,? :
三元运算符,if
- 子句和逻辑AND / OR运算符确实使用内部{{3这正是我们理解 falsy 值0
,NaN
,""
,null
,undefined
的原因和false
。
然而,当你比较事物时,ToBoolean
conversion开始发挥作用,当比较对角线类型时会产生一些看似奇怪的结果。在你的情况下:
null
仅等于自己或undefined
但不等于false
true
首先被转换为1
。然后,当一个对象与一个数字进行比较时,它将被转换为(non-strict) equality comparsion algorithm(没有首选类型) - 调用基本上调用to a primitive value的DefaultValue
algorithm arrays' .toString
method .join()
it }。因此,[]
会投放到""
- 然后传递给ToNumber
,因为它会与1
进行比较。最后0
不是 1
。但是,[] == false
和[1] == true
或["1"] == true
会有... 答案 1 :(得分:0)
魔法 *神秘地挥手*
更严重的是,对于前两个,!
运算符会在toBoolean
上调用null
,因此,如果您选中了!null == !false
或!!null == false
,应该得到true
。在其他情况下可能会发生类似的事情。
根据Tore Hanssen提供的信息,我们也可以回答其他两个问题。 []是'truthy'值,但不是布尔值,所以直接将它与true返回false
。但是,你可以使用!运算符再次使其成为布尔值,因此!![] == true
返回true
!
答案 2 :(得分:0)
这里有一篇关于这个主题的有趣帖子:http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/
在你的一些例子中,强迫强制,仅使用“==”是不够的。
!! null == false
!! []
!! [] == true