偶然见看到的一个关于类型转换的题目:
对象 ab 是两个字面量函数,在进行比较的时候,可以发现大小和相等的比较结果都是 false
var a = {b: 42};
var b = {b: 43};
a < b; //false
a == b; //false
a > b; //false
a <= b; //true
a >= b; //true
在这个过程之,a 和 b 比较的时候,到底比较的是什么?为什么 <=> 三个运算符都是 false。?
为什么 a<=b
是 true?a<=b == true
是因为 JS 计算的是 !(a>b)
吗?
ES 规定如此。
==
、!=
不说了,基础问题了;说下>
、<
这种吧,最后都会转换为数值形式做比较。首先尝试调用对象的
Symbol.toPrimitive
方法得到原始值。如果没有这个方法就再尝试调用
valueOf
。经过以上转换后,如果两边都是
string
,则按 Unicode 逐位比较;否则,都强转成number
比较。Object
强转后就变成了NaN
。NaN
是个特殊的number
,它跟任意数(包括它自己)做任何比较运算,恒为false
。至于
>=
、<=
你说的对,确实是取反。P.S. 完整讲述可以自己搜索一下 ECMA-262 文档中关于 Abstract Relational Comparison 的相关定义:https://tc39.es/ecma262/#sec-abstract-relational-comparison