==和===的区别
等于操作符(==)
会先触发隐式类型转换,再比较值
javascript
5 == '5'; // true 先把'5'转为5
true === 1; // true 先把true转为1
[] == 0; // true 先把[]转为''再转为0
let obj = {
valueOf: function() {
return 1;
}
}
obj == 1; // true 先调用对象的valueOf方法取得原始值再进行比较
null == undefined; // true 特殊规则
let obj1 = {name:"xxx"};
let obj2 = obj1;
obj1 == obj2; // true obj1、obj2指向同一内存地址
NaN == NaN; // false
{} == {}; // false 内存地址不一样
一些违反直觉的结果
javascript
0 == '' // true
0 == '0' // true
'' == '0' // false
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r\n' == 0 // true
规则
两个都为基本类型,字符串和布尔值都会转换成数值,再比较
基本类型与引用类型比较,对象转化成其原始类型的值,再比较
两个都为引用类型,则比较它们是否指向同内存地址
null 和 undefined 相等
存在 NaN 则返回 false
全等操作符(===)
直接比较值和类型,不触发类型转换,类型不同直接返回false
javascript
5 == '5'; // false 类型不同
true === 1; // false 类型不同
[] == 0; // false 类型不同
let obj = {
valueOf: function() {
return 1;
}
}
obj == 1; // false 类型不同
null == undefined; // false 类型不同
NaN == NaN; // false
let obj1 = {name:"xxx"};
let obj2 = obj1;
obj1 === obj2; // true obj1、obj2指向同一内存地址
拓展
Object.is()
与===
类似,但解决两个特殊场景
NaN
等于自身+0
和-0
不相等
javascript
Object.is(NaN, NaN); // true
Object.is(+0, -0); // false