EcmaScript - 相等操作符
相等操作符
相等表达式的结果: EqualityExpression == RelationalExpression
最终计算成以下结果。
- 将
EqualityExpression
表达式的结果赋值给lref
- 将
GetValue(lref)
赋值给lref
(GetValue
的算法可以具体再查阅规范) - 将
RelationalExpression
表达式的结果赋值给rref
- 将
GetValue(rref)
赋值给rref
- 返回执行"抽象相等"算法的结果即
rval
==lval
值得一提的是,不知道为什么规范里rval
和lval
相对于对应表达式,互相换了个位置。
抽象相等比较算法
接上小节第五个步骤,也就是核心。
比较x == y
, 其中x
和y
是值,则返回true
或false
。比较过程具体如下。
x和y类型相等(插一句这里的类型就是6种, null, undefined, string, number, boolean, object,不要和typeof关键字得到几种类型搞混)
a. 如果
Type(x)
是Undefined
, 返回true
b. 如果
Type(x)
是Null
, 返回true
c. 如果
Type(x)
是Number
, i. 如果
x
是NaN
, 返回false
ii. 如果
y
是NaN
, 返回false
iii. 如果
x
是和y
相同的值,则返回true
iv. 如果
x
是+0
且y
是-0
, 则返回true
v. 如果
x
是-0
且y
是+0
, 则返回true
vi. 返回
false
如果
x
是null
且y
是undefined
, 返回true
如果
x
是undefined
且y
是null
, 返回true
如果
Type(x)
是Number
且Type(y)
是String
,则返回比较x == ToNumber(y)
的结果如果
Type(x)
是String
且Type(y)
是Number
,则返回比较ToNumber(x) == y
的结果如果
Type(x)
是Boolean
, 则返回比较ToNumber(x) == y
的结果如果
Type(y)
是Boolean
, 则返回比较x == ToNumber(y)
的结果如果
Type(x)
是String
或是Number
且Type(y)
是对象,返回比较x == ToPrimitive(y)
的结果如果
Type(x)
是Object
且Type(y)
是String
或Number
,返回比较ToPrimitive(x) == y
的结果返回
false
总结
从上面的算法来看,我们不难发现整个过程就是在转换+递归。
如果是类型相同,我们可以直接按照具体值进行比较。
但如果类型不同,则依照顺序依次转换每个值,再最终进行比较。
最后吐槽下,面试题考这个真的是八股文。谁会去记忆这种东西呢?
我又对照了红宝书第三版的相等操作符的算法。红宝书对规范总结的很好啊,所以这本书被广泛推崇不是没有原因的。