简单来说:
== (相等):先转换再比较
== (全等):仅比较而不转换
特殊值的比较
- NAN 不等于任何值,规定NaN 也不等于 NaN,所以在判断值是否为NAN时,会使用isNaN()
- undefined和null的比较
- 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值。undefined 和 null 都不会进行类型转换
- undefined和null的是相等的,但是不全等(严格模式下)
(==)如果两个操作数的类型相同,就不用进行转换数据类型,但是在不同时会转换数据类型再进行转换
类型相同的比较(== ===)
- 两个操作数都为引用类型(对象或数组),那么会比较他们的内存地址(栈地址,即引用地址)
- {} == {} 比较结果为false,因为他们两个属于对象类型;如果要判断对象是否为空,使用JSON.stringify({})=="{}"判断
- 两个操作数为值类型(字符串、数值、布尔类型、null、undefined),就可以直接比较
(==)比较转换的优先级
- 向数字转换,比如true=="true"不会转向左边的布尔类型,也不会转向右边的字符串类型,会使两边转为数字再进行比较,转为:1 == NAN 再比较,所以比较结果为false
- 如果一个操作数是对象,则调用对象的 valueOf() 方法,用得到的基本类型值按照前面的规则进行转换比较。