== 和 ===
一、等于操作符
等于操作符用两个等号(==)表示,当操作数相等时,会返回true。
等于操作符在比较中会先进行类型转化,再确定操作数是否相等。
//如果操作数是bool值,则将其转换为数字再比较是否相等。
let result1 = (true == 1);// true
//如果一个操作数是字符串,另一个操作数是数值,则将字符串转换为数值再比较。
let result2 = ("55" == 55); // true
//如果一个操作数是对象那个,另一个不是,则调用对象的valueOf()方法取得其原始值,再根据前面的规则进行比较
let obj = {valueOf: function(){return 1}};
let result3 = (obj == 1); // true
//null和undefined是相等的
let result4 = (null == undefined); // true
//如果任一操作数是NaN,则相等操作符返回false
let result5 = (NaN == NaN); // false
//如果两个操作数都是对象,则比较他们是不是同一个对象,如果两个操作数都指向同一个对象,则相等操作符返回true。
let obj1 = {name:"xxx"};
let obj2 = {name:"xxx"};
let result6 = (obj1 ==obj2); // false
小结:
- 两个都为简单类型,字符串和bool值都会转换成数值,再比较。
- 简单类型与引用类型比较,对象转化成其原始类型的值,再比较。
- 两个都为引用类型,则比较他们是否指向同一个对象。
- null和undefined相等。
- 存在NaN则返回false。
二、全等操作符
全等操作符由三个等号(===)表示,只有两个操作数在不转换的前提下相等才返回true,要求类型和值都相同。
let result1 = ("55" === 55); // false,不相等,因为数据类型不相同。
let result2 = (55 === 55); // true ,相等,数据类型和值都相同。
//null和undefined都与其自身严格相等。
let result3 =(null === null); // true
let result3 =(undefined === undefined); // true
三、区别
相等操作符( == )会做类型转换而后进行值的比较,全等操作符( === )不会。
null和undefined在相等操作符下是相等的,在全等操作符下是不相等的。
四、总结
相等运算符发隐藏类型转换会在一些情况下导出反直觉的结果。
'' == '0' // false
0 == '' // true
0 == '0' // true
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r\n' == 0 // true
在比较null的情况时,一般使用相等操作符。
const obj = {};
if(obj.x == null){
console.log("1"); //执行
}
//等同于下面的写法
if(obj.x === null || obj.x === undefined) {
...
}
使用相等操作符的写法更加简洁。在比较对象的属性为null或者undefined的情况下用相等操作符,其余情况都用全等操作符。