最近在读《你不知道的Javascript(中卷)》,看到有关于等号的内容,突然想起来以前的面试题中被问到这两个问题的答案,当时答得一塌糊涂,现在准备好好地梳理一下。
书上提醒了我,如果大家说的不太一样的话,那么就去看标准
ecma的标准(这里6.0)中,7.2.12是Abstract Equality Comparison,也就是“==”,这里被称为抽象相等,7.2.13讲Strict Equality Comparison,也就是“===”,严格相等。
对于下面的问题
{}=={}
{}==={}
[]==[]
[]===[]
NaN == NaN
NaN === NaN
对于数组和对象,都是引用类,那么看引用的是不是同一个对象,如果是的话,为true,否则为false,==和===是一样的标准。NaN什么情况下都与自己不相等。
对于==
如果被比较的一方有数字的话,另外一个是primitive类型的话,那么将另外一个toNumber,转化为数字再进行比较。
这里就涉及到一个布尔值的问题。
"42"==true
"42"==false
如果有一个为布尔值的话,那么先把布尔值转为数字,再进行比较,true为转为1,false转为0。
If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
那么问题就变成了
"42"==1
"42"==0
这个时候,在一方为数字的时候,把另外一方转化为数字,把"42"转为42,显然两个答案都是false。
另外一种是”undefined"和”null"之间,他们可以互通,其他情况都不可以。
最后一种情况是一方是Object,另外一方是Primitive的情况。
[42] == 42
这种情况下,对Object实行toPrimitive,然后再进行比较。