// 基本数据类型赋值都是深拷贝 因为都是拷贝的栈地址 数据都是互不影响的
// 相反 引用类型的数据 直接赋值 拷贝的是栈里面的堆地址 数据相互影响 这就是浅拷贝
// 那么怎么实现引用数据类型的深拷贝呢:需要开辟新的栈地址 存储 数据 就可以了
// 第一种情况
// 1.一维数组和没有嵌套的对象 也就是没有嵌套的数组和对象
// 直接使用展开运算符
let a = [1,2,3];
let b = [...a];
a[0] = 9
console.log(a,b)
已经实现深拷贝 数据互不影响
注意:展开运算符只能实现一层拷贝,多层嵌套不行 看下面例子
let a = [1,2,[7,8,9]]
let b = [...a]
a[2][0] = 9
console.log(a,b)
数据是相互影响的 此时 是一个浅拷贝的状态
//第二种情况
//2.数组嵌套和对象嵌套
let a = [1,2,[7,8,9]]
let b = JSON.parse(JSON.stringify(a))
a[2][0] = 9
console.log(a,b)
此时 已经实现深拷贝 数据互不影响
注意:此方法无法拷贝对象 看下面例子
let a = {
name:'111',
say(){
console.log(this.name);
}
}
let b = JSON.parse(JSON.stringify(a))
console.log(a,b);
//第三种情况
// 对象 数组 函数 全部都实现深拷贝 :递归
let a = {
name:'111',
age:[15,18],
say(){
console.log(this.name);
}
}
let b = deepClone(a)
function deepClone(oldData){
//判断数据是对象还是数组 把null除去
if(typeof oldData === 'Object' && oldData !== null){
//RES接收数据或者对象
let res = Array.isArray(oldData)?[]:{};
for(let k in oldData){
if(oldData.hasOwnProperty(k)){
//这里就是递归 如果是多层嵌套 再次调用deepClone 直到全部赋值完毕
res[k] = deepClone(oldData)
}
}
return
}
else{
return oldData
}
}
console.log(a,b);
这里更改任何a里面的数据都是不会影响b的 没有举例子修改 大家可以自己试一试的哈