== 和 === 运算符的区别
相等操作符 (==)
==运算符会进行类型转换,然后再比较操作数的值是否相等。它会根据以下规则进行隐式类型转换:
- 布尔值转换为数值:
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); // truenull和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。它直接比较操作数的类型和值:
类型和值都相同时,返回
truelet result1 = (55 === 55); // true类型不同即使值相同,返回
falselet result1 = ("55" === 55); // falseundefined和null与自身严格相等let result1 = (null === null); // true let result2 = (undefined === undefined); // true
总结
- 类型转换:
==会进行类型转换后再比较,而===不会进行类型转换。 - 精确性:
===更加精确,避免了类型转换带来的不确定性。 null和undefined:==认为null和undefined相等,而===不认为它们相等。