== 和 === 运算符的区别
相等操作符 (==)
==
运算符会进行类型转换,然后再比较操作数的值是否相等。它会根据以下规则进行隐式类型转换:
- 布尔值转换为数值:
true
转换为1
,false
转换为0
。
jslet result1 = (true == 1); // true
- 字符串转换为数值:字符串会转换为对应的数值,再进行比较。
jslet result1 = ("55" == 55); // true
- 对象转换为原始值:通过调用对象的
valueOf()
方法获取其原始值,再进行比较。
jslet obj = {valueOf:function(){return 1}}; let result1 = (obj == 1); // true
null
和undefined
相等。
jslet result1 = (null == undefined); // true
- 如果有操作数为
NaN
,则相等操作符返回false
。
jslet result1 = (NaN == NaN); // false
- 对象之间比较引用:比较两个对象是否引用同一个内存地址。
jslet obj1 = {name: "xxx"}; let obj2 = {name: "xxx"}; let result1 = (obj1 == obj2); // false
- 布尔值转换为数值:
全等操作符 (===)
===
运算符不会进行类型转换,只有两个操作数的类型和值都相同,才会返回true
。它直接比较操作数的类型和值:
类型和值都相同时,返回
true
let result1 = (55 === 55); // true
类型不同即使值相同,返回
false
let result1 = ("55" === 55); // false
undefined
和null
与自身严格相等let result1 = (null === null); // true let result2 = (undefined === undefined); // true
总结
- 类型转换:
==
会进行类型转换后再比较,而===
不会进行类型转换。 - 精确性:
===
更加精确,避免了类型转换带来的不确定性。 null
和undefined
:==
认为null
和undefined
相等,而===
不认为它们相等。