有很多小白会经常疑惑,为什么看着一模一样的两个对象或者数组,但是用==或者===打印出来的结果确实false 看下面这两个数组
控制台的打印结果是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方法