区别
==(相等):先转换再比较
===(全等):仅比较而不转换
问题
true=="true" //false
undefined==null //true
{}=={} //false
特殊值的比较
- NAN 不等于任何值, 规定NaN 也不等于 NaN,所以在判断值是否为NAN时,会使用isNaN()
- undefined和null的比较
- 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值。
- null 和 undefined 是相等的,但是不全等。
表达式 | 值 |
---|---|
null == undefined | true |
null === undefined | false |
null==true、null==false、undefined==1(null,undefined不会进行转换) | false |
NAN==NAN | false |
(==)如果两个操作数的类型相同,就不用进行转换数据类型,但是在不同时会转换数据类型再进行转换
类型相同的比较(==、===)
- 两个操作数都为引用类型(对象、数组),那么会比较他们栈地址,就是引用地址
- {}=={}的比较为false,因为他们是两个对象;如果想判断对象是否为空,使用JSON.stringify({})=="{}"判断
- 两个操作数为值类型(字符串、数值、布尔类型、null、undefined),就可以直接比较
(==)比较转换的优先级
- 向数字转换,比如true=="true"不会转向左边的布尔类型,也不会转向右边的字符串类型,会使两边转为数字再进行比较,转为:1==NAN 再比较,所以比较结果为false
- 如果一个操作数是对象,则调用对象的 valueOf() 方法,用得到的基本类型值按照前面的规则进行转换比较。
编程建议
推荐使用全等和不全等操作符,避免类型的转换带来的影响。