为什么" [] == 0" " []"是真的" 0"是假的?

时间:2015-08-06 11:04:34

标签: javascript

如果我在浏览器控制台中执行以下行

!![] //--- returns true
!!0 //--- returns false

我得到[]0有不同的布尔值。

我不明白为什么

[] == 0 //--- returns true

返回true

我错过了什么?

2 个答案:

答案 0 :(得分:5)

请记住,数组是对象,0是数字。

正如“user2864740”告诉..

1)当你做

!![] //--- returns true
!!0 //--- returns false

您正在执行所谓的“ToBoolean”转换

https://es5.github.io/#x9.2

  

如果参数为+ 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”数字和字符串

进行比较时
  
      
  1. 如果Type(x)为Number且Type(y)为String,则返回比较结果x == ToNumber(y)。
  2.   

所以让我们尝试将空字符串转换为数字

Number("") === 0

最后

0 === 0

我希望这能解释一些事情:)

答案 1 :(得分:1)

JavaScript可能会将数组转换为数字:
!!Number([]) // false
Number([]) == 0 // true