两个对象数组,第二个是通过caocat或者slice或者push第一个的对象到第二个数组,那么改变这些对象的属性,实际上两个数组会一起变化,因为是引用类型

测试代码

/**
 * 之前关于引用类型和对象以及和一些数组方法的联系起来之后的一些问题
 */

// 1.两个数组push相同的对象,push的是引用类型吗  是
// let obj = {
//   a: 1
// }
// let arr1 = []
// let arr2 = []
// arr1.push(obj)
// arr2.push(obj)
// arr1[0]['a'] = 10
// console.log(arr2[0].a)// 10

// 2.slice呢 slice到的也是引用类型  是
// let arr1 = [{ a: 1 }]
// let arr2 = arr1.slice(0, 1)
// arr1[0]['a'] = 10
// console.log(arr2[0]['a'])// 10

// 3.那concat之后呢,或者...展开呢,还是引用类型吗  是
// let arr1 = [{ a: 1 }]
// let arr2 = arr1.concat()
// let arr3 = [...arr1]
// arr1[0]['a'] = 10
// console.log(arr2[0]['a'], arr3[0]['a'])// 10 10

// 4.那普通的for循环,把符合条件的放到一个新数组中,再改会一起改吗
// let arr1 = [{ a: 1 }, { a: 2 }]
// let newArr = []
// arr1.map(el => {
//   if (el.a == 1) {
//     newArr.push(el)
//   }
// })
// newArr[0]['a'] = 10
// console.log(newArr[0]['a'], arr1[0]['a'])// 10 10

// ...可以展开对象和数组

// 找到一种比较好的解决方法,...展开原对象在新对象里,然后map return 或者push
// 的时候这样...,反正核心是 {...对象} 这样就是两个不同的对象了
let arr1 = [{ a: 1 }, { a: 2 }]
let newArr = []
arr1.map(el => {
  if (el.a == 1) {
    newArr.push({ ...el })
  }
})
// newArr[0]['a'] = 10
arr1[0]['a'] = 10
console.log(newArr[0]['a'], arr1[0]['a'])// 10 1

// 那我以往的操作都没有注意这些。。。。,而没出问题,可能是因为
// 正好都要改把。。,又或者是没比的那么细到属性,而只是对比的增减了哪些对象
// 或者比了id啥的

解决方法  {...原对象}   

但是这个解决方法。。。。因为展开运算符...是浅拷贝,也就是说如果对象里面但凡有个属性是引用类型。。。那。。。就和之前一样也会一起被改

所以真有需要,还是得一个个深拷贝?  lodash.defaultsDeep或者lodash.merge

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值