这是我参与更文挑战的第1天,活动详情查看: 更文挑战”
什么是深浅拷贝
arr1=[1,2,3,4]
arr2=arr1
这里 他就是将arr1的内存地址复制到 arr2里面 让arr2也可以使用arr1里面的值,而当我们想要单独改变arr2里面的值是比如
arr2.push(5)
这是我们在打印一下arr1和 arr2里面的值,
console.log(arr1); //[1, 2, 3,4 ,5]
console.log(arr2); //[1, 2, 3, 4, 5]
会发现两个都发生了变化,因为 arr2在push的时候, 他会顺着这个内存地址去寻找数据,之后才进行增删操作,而我们的arr1也使用的这个内存地址,所以 他们 打印的结果就是一样的了
那么 我们就得到一个结论 在使用浅拷贝的时候, 如果要对数进行增删操作,那么就会,改变原数组。 数组的深拷贝 那么 怎么在保持原数组不变的情况下 改变新数组呢 毫无疑问肯定是需要深拷贝的 怎么进行生拷贝呢 方式1 偏向基础的方式
for(let i = 0, i <arr1.length, i++){
arr2[i] = arr1[i]
}
arr2.push(5)
这时我们早打印arr1和arr2会发现 arr1里面的数组并不会因为 arr2 而改变 这种方式就是将arr1里面的所有内容,逐一赋值到arr2里面,而这时arr2的内存地址 就不会和arr1的内存地址一样 arr2会生成一个新的内存地址了,所以就不会改变arr1的数组长度了
方法二
使用ES6提供的 [...]用算符, 只需要这样
arr2=[...arr1]
这种方式 他会自己在数组内进行 循环操作 其实是等价与方法一的
那么有的小伙伴可能就会问了,那如果克隆系统对象,怎么解决呢 ?
let date1 = new Date(2021, 9, 6, 0, 0 ,0) //新建一个时间对象为 2021年 8月6日, 0点
let date2 = new Date(date1)
date2.getFuYear(2020)
console.log(date1); //[2021, 9, 6, 0, 0 ,0]
console.log(date2); //[2020, 9, 6, 0, 0 ,0]
对 没有错, 这里我们就可以直接将第一个实例,作为参数的方式直接, 传递给第二个对象就好了,怎么样是不是 很简单,嘿嘿
但是要注意哦 数组是不能直接这样用的。