js相等(==)与全等(===)的区别

相等是“==”,而全等是“===”,相等和全等的区别,总结就是:

  • 相等 ==: 先转换类型再比较
  • 全等 ===:直接比较,不转换类型,只要是类型不同就不相等,类型相同的看值是否相等
  • Object.is(value1,value2):ES6 提出“Same-value equality”(同值相等)算法,用来解决这个问题。Object.is就是部署这个算法的新方法。它用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。

Object.is与“===”不同之处只有两个:一是+0不等于-0,二是NaN等于自身。

例如:

  1.  
    55 == "55" // true
  2.  
    55 === "55" // false

分析代码,对于相等来说”55”会被转换成number类型的55,所有比较后相等,但是对于全等来说,”55”不会被转换,由于类型不同(一个number一个String)所有比较之后为false,所以对于全等来说,必须保证数据类型也相同

相等转换规则:

  • 对于boolean值,false转换为0,true转换为1

      代码为:

  1.  
    true == 1 // true
  2.  
    true == 2 // false
  • 如果一个操作数是字符串,另一个是数值,比较之前将字符转换为数值

      代码为:

"5" == 5  // true
  • null 与 undefined比较是相等的,而且对比之前不能将null与undefined转换成其他值

      代码为:

  1.  
    null == undefined // true
  2.  
    null == 0 // false
  3.  
    undefined == 0 // false
  • 如果两个操作数是对象,那么比较他们是不是指向同一个对象。

       代码为:

  1.  
    var a = {}
  2.  
    var b =a
  3.  
    a == b // true
  4.  
    c = {}
  5.  
    a == c // false
  • 有一个操作符为NaN就返回false

       代码为:

  1.  
    NaN == NaN // false
  2.  
    5 = NaN // false
  3.  
    NaN === NaN //false
  • 如果其中一方是否为 object 且另一方为 string、number 或者 symbol , 将 object 转为原始类型再进行判断
  1.  
    let person1 = {
  2.  
    age: 25
  3.  
    }
  4.  
    let person2 = person1;
  5.  
    person2.gae = 20;
  6.  
    console.log(person1 === person2); //true,注意复杂数据类型,比较的是引用地址
  7.  
     
  • new Number()是一个内置的函数构造函数。 虽然它看起来像一个数字,但它并不是一个真正的数字:它有一堆额外的功能,是一个对象。当我们使用==运算符时,它只检查它是否具有相同的值,所以a和b是相等的;然而,当我们使用===操作符时,类型和值都需要相等,b和a与c的类型不一样,所以不等。

==会引发隐式类型转换,右侧的对象类型会自动拆箱为Number类型。

  1.  
    let a = 3;
  2.  
    let b = new Number(3);
  3.  
    let c = 3;
  4.  
     
  5.  
    console.log(a == b); //true
  6.  
    console.log(a === b); //false
  7.  
    console.log(b === c); //false

思考:[] == ![]

我们来分析一下: [] == ![] 是true还是false?

  1. 首先,我们需要知道 ! 优先级是高于 == (更多运算符优先级可查看: 运算符优先级)
  2. ![] 引用类型转换成布尔值都是true,因此![]的是false
  3. 根据上面的比较方法,其中一方是 boolean,将 boolean 转为 number 再进行判断,false转换成 number,对应的值是 0.
  4. 根据上面比较方法,有一方是 number,那么将object也转换成Number,空数组转换成数字,对应的值是0.(空数组转换成数字,对应的值是0,如果数组中只有一个数字,那么转成number就是这个数字,其它情况,均为NaN)
  5. 0 == 0; 为true

 

原文:https://blog.csdn.net/m0_37686205/article/details/88554346?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160965774416780277046963%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=160965774416780277046963&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-19-88554346.pc_search_result_cache&utm_term=JS%20%E4%B8%AD%20==%20%E5%92%8C%20===%20%E5%8C%BA%E5%88%AB%E6%98%AF%E4%BB%80%E4%B9%88

posted on 2021-01-03 15:11  code->  阅读(740)  评论(0编辑  收藏  举报

导航