等于操作符:==

如果操作数相等,则返回 true。在比较过程中,会先进行类型转换,再确定操作数是否相等。

比较过程:

  • 相同操作类型,相同则进行操作数比较
  • 不同操作类型,先进行数据类型转换
    • 两个简单类型,字符串和布尔值都会转为数值,再比较
    • 简单类型与引用类型,对象转化成其原始类型的值,再比较
    • 两个引用类型,则比较是否指向同一对象
    • nullundefined 相等
    • 存在 NaN 则返回 false

布尔值和字符串,在与数值比较时,会转为数值进行比较

// true为布尔型,转为数值1
true == 1; // true
// "1"为字符串型,转为数值1
"1" == 1; // true

布尔值和字符串比较,两侧类型不同,布尔值会转为数值0/1,此时为数值 == 字符串,两侧操作类型仍然不同,此时字符串会转为数值,进行 数值 === 数值比较,操作数相同返回 true

// 转为 1 === 1
true == "1"; // true

// 转为 1 === 2
true == "2"; // false

// 对象属性一般为空(null) 或者为未定义(undefined)

null == undefined; // true
"undefined" == undefined; // false

NaN表示一个值不是数值类型,判断一个值非数值类型使用isNaN()

NaN == NaN; // false
isNaN(NaN); // true

两个对象,比较是否指向同一个对象

let obj1 = {
   name:"xxx"};
let obj2 = {
   name:"xxx"};
let obj2 = obj1;
obj1 == obj2; // false
obj1 == obj3; // true

全等操作符 ===

只有两个操作数在不转换的前提下相等才返回true,要求类型相同,值相同。

比较过程:

  • 如果类型不同,就一定不相等
  • 如果两个都是数值,并且是同一个值,那么相等;如果其中至少一个是NaN,那么不相等。(判断一个值是否是NaN,只能使用isNaN( ) 来判断)
  • 如果两个都是字符串,每个位置的字符都一样,那么相等,否则不相等。
  • 如果两个值都是true,或是false,那么相等
  • 如果两个值都引用同一个对象或是函数,那么相等,否则不相等
  • 如果两个值都是null,或是undefined,那么相等

全等操作符不会进行类型转换

"1" === 1; // false,不相等,数据类型不同
1 === 1); // true,相等,数据类型相同值也相同

nullundefined与自身严格相等

null === null; // true
undefined === undefined; // true

小结

等于操作符 == 会经过类型转换后转为全等比较 === ,虽然容错性较高,但是 === 全等更加准确和高效,一般的等于操作建议使用 ===
对象属性的比较,如果是判断null 或者undefined,使用相等操作符==更加简洁。

 const obj = {
   };
 if(obj.x == null){
   
     ...
 }
 // 等同于
 if(obj.x === null || obj.x === undefined){
   
     ...
 }

参考文档:
https://vue3js.cn/interview/JavaScript/<mark>%20_</mark>=.html
https://www.cnblogs.com/nelson-hu/p/7922731.html