知道为什么会这样吗?
答案 0 :(得分:3)
当==
用于比较不同类型的内容时,例如数组([null]
)和false
,它会执行特定的步骤,称为Abstract Equality Algorithm (引用如下)试图强迫他们做可以比较的事情。 (因为==
是“松散”的等式运算符。)
首先它会看到操作数是null
还是undefined
,但在这种情况下都不是。
然后它会看到它是在比较一个数字还是一个字符串,但在这种情况下也不是这样。
然后似乎任何一个操作数都是布尔值,当然这是一个布尔值。由于其中一个是布尔值,因此它在规范中执行一个名为ToNumber
的抽象操作,将另一个转换为数字并执行另一个==
。 (Number
函数用作函数而不是构造函数时,基本上是抽象ToNumber
操作的包装器。)
所以
[null] == false
变为
0 == false
...因为ToNumber([null])
将其参数强制转换为字符串(通过ToPrimitive
),获取""
,然后将其转换为0
。
所以现在==
的某个操作数是一个数字。因此它将其他转换为数字。 Number(false)
为0
。
因此,[null] == false
是真的。
那么[null, null] == false
呢?将[null, null]
转换为字符串时,我们会","
,ToNumber
无法转换为有效数字。因此它将其转换为NaN
。关于NaN
的一个有趣的事情是,它是一个数字,但它永远不会与其他任何东西相等。所以:
[null, null] == false
变为
NaN == false
变为
NaN == 0
...这是false
,因为(再次)NaN
永远不会等同于任何事情。
这是抽象平等算法:
x
)。y
)。如果Type(x
)与Type(y
)相同,那么
a)返回执行Strict Equality Comparison x
=== y
的结果。
如果x
为null
且y
为undefined
,请返回true
。
x
为undefined
且y
为null
,请返回true
。x
)为数字且类型(y
)为字符串,则返回比较结果
x
== ToNumber(y
)。x
)为字符串且类型(y
)为数字,则返回比较结果ToNumber(x
)== y
。x
)为布尔值,则返回比较结果
ToNumber(x
)== y
。y
)为布尔值,则返回比较结果
x
== ToNumber(y
)。x
)是String,Number或Symbol而Type(y
)是Object,则返回比较结果
x
== ToPrimitive(y
)。x
)是对象,而类型(y
)是字符串,数字或符号,则返回
比较结果ToPrimitive(x
)== y
。false
。