为什么"[] == 0"返回true而"[]"为真且"0"为假?

BeN*_*ErR 3 javascript

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

!![] //--- returns true
!!0 //--- returns false
Run Code Online (Sandbox Code Playgroud)

我明白了,[]并且0有不同的布尔值.

我不明白为什么

[] == 0 //--- returns true
Run Code Online (Sandbox Code Playgroud)

回报true.

我错过了什么?

obe*_*iro 5

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

而正如"user2864740"告诉..

1)当你做的时候

!![] //--- returns true
!!0 //--- returns false
Run Code Online (Sandbox Code Playgroud)

您正在执行所谓的"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).

To ToPrimitive的工作原理是文章:),但很容易记住,closet基本类型到数组是字符串.数组将转换为空字符串.

[] .toString()===""

所以现在我们需要比较空字符串和数字0

"" == 0   // true
Run Code Online (Sandbox Code Playgroud)

嗯.这是真的.但那是为什么呢?请记住,当您与"Equality Comparison"数字和字符串进行比较时

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

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

Number("") === 0
Run Code Online (Sandbox Code Playgroud)

最后

0 === 0
Run Code Online (Sandbox Code Playgroud)

我希望这能解释一下:)