Skip to content

==和===的区别

等于操作符(==)

会先触发隐式类型转换,再比较值

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

Released under the MIT License.