测试代码
/**
* 之前关于引用类型和对象以及和一些数组方法的联系起来之后的一些问题
*/
// 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