JS两个数组看着一样,为什么不相等

291 阅读1分钟

  有很多小白会经常疑惑,为什么看着一模一样的两个对象或者数组,但是用==或者===打印出来的结果确实false 看下面这两个数组

image.png

  控制台的打印结果是false。

  为什么?

  基本数据的比较是值的比较:

    它们的值相等它们就相等(==)

    它们的值和类型都相等时它们就全等(===)。

  对象、数组和基础数据不同,对象的比较不是值的比较,而是引用地址的比较:

    假如两个数组对象具有相同的属性和值,相互比较的值也是不等

    哪怕两个数组对象各个索引元素也完全相等,它们还是不等的

  举个栗子:

// 具有相同属性的两个对象
let obj1 = {a:1}
let obj2 = {a:1}

obj1 == obj2                        // 结果false: 两个单独的对象不相等

// 两个单独的空数组
let a = []
let b = []            
a == b                        // => false: 两个单独的数组不相等

  大家都知道,对象是引用类型(reference type),和JS的基本类型不一样。对象值都是引用(reference),对象的比较其实是地址的比较:只有它们引用同一个基对象时,它们才相等。

  举个栗子:

// 先定义一个空数组arr
let arr = [];  
// arr1引用数组arr
let arr1 = arr;   
// arr1进行数组操作
arr1[0] = 1;    
// 原始的数组arr也会修改
arr[0]         
// 两个数组地址一样,所以相等
arr === arr1      

还有一种方法可以使数组相等 那就是JSON方法

image.png

image.png