带有强制的Javascript中的虚假值

时间:2013-08-28 23:45:56

标签: javascript

有人可以向我解释为什么......(这是在Chrome控制台中)

null == false // false

!null == false // false

[]? '你好':'再见'//'你好'

[] ==是吗? '你好':'再见'//'再见'

我可以提出更多,但基本上javascript是如何得出这些结果的?

3 个答案:

答案 0 :(得分:2)

JavaScript做了很多类型转换,如果不知道它就不明显(JavaScript equality transitivity is weird)。

! NOT运算符,Boolean函数,? :三元运算符,if - 子句和逻辑AND / OR运算符确实使用内部{{3这正是我们理解 falsy 0NaN""nullundefined的原因和false

然而,当你比较事物时,ToBoolean conversion开始发挥作用,当比较对角线类型时会产生一些看似奇怪的结果。在你的情况下:

  • null仅等于自己或undefined但不等于false
  • 当您将数组对象与布尔值进行比较时,它会变得更加复杂。布尔值与其他类型进行比较,就好像它们是数字一样,即true首先被转换为1。然后,当一个对象与一个数字进行比较时,它将被转换为(non-strict) equality comparsion algorithm(没有首选类型) - 调用基本上调用to a primitive valueDefaultValue 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