1.对于基本数据类型,严格意义上来说是赋值
let a = 5;
let b = a;
b = 3;
console.log(a, b);
2.对于数组和对象的赋值都叫做浅拷贝
let arr = [1, 2, 3];
let newArr = arr;
newArr.push(4) //改变了newArr原数组也的到了改变
console.log(newArr); //1,2,3,4
console.log(arr); //1,2,3,4
3.解构赋值:对于一维数组和对象可以看作是深拷贝,多维的就是浅拷贝
let arr2 = [1, 2, 3];
let newArr2 = [...arr2]; //解构赋值
newArr2.push(4) //改变了新的数组,原数组不会改变
console.log(arr2);
console.log(newArr2);
let arr3 = [[1, 2, 3], [4, 5, 6]]; //二维数组
newArr3 = [...arr3]
newArr3[0].push(888) //改变了新的数组,原数组也会得到改变
console.log(arr3);
console.log(newArr3);
let list = [
{ id: 1, stuName: '小明', class: '五年一班' },
{ id: 2, stuName: '小红', class: '五年二班' },
{ id: 3, stuName: '小绿', class: '五年三班' }
]
//通过JSON方法深拷贝
//常见的实现深拷贝的方式
//方法不能拷贝
let newList = JSON.parse(JSON.stringify(list))
newList.push({ id: 888 })
console.log(list);
console.log(newList);
深拷贝的用法:通过JSON方法深拷贝,方法不能拷贝
let list = [
{ id: 1, stuName: '小明', class: '五年一班' },
{ id: 2, stuName: '小红', class: '五年二班' },
{ id: 3, stuName: '小绿', class: '五年三班' }
]
//通过JSON方法深拷贝
//常见的实现深拷贝的方式
//方法不能拷贝
let newList = JSON.parse(JSON.stringify(list))
newList.push({ id: 888 })
console.log(list);
console.log(newList);
标准的深拷贝(手写深拷贝):
function depClone(source){
const targetObj = source.constructor === Array?[]:{};//判断外层定义是数组还是对象
for(let keys in source){
//keys可能是基本数据类型,也可能是数组,也可能是对象
if(source[keys]&& typeof source[keys]==='object'){
targetObj[keys]=depClone(source[keys])
}else{
//基本数据类型直接赋值
targetObj[keys]=source[keys]
}
}
}
return targetObj
}
深拷贝和浅拷贝的区别
1.基本数据类型变量栈空间的值就是变量本身的值
2.引用数据类型变量栈空间的值就是对应的堆空间地址
所以直接赋值的话,直接从栈空间访问,所以两个变量的值(堆空间地址)是一样的,本质就是同一片内存
浅拷贝相当于把地址对应的内存空间完全一致的复制了一份,所以里面的引用数据类型地址也是一样的
深拷贝则是把这一整个地址链上的内存完全的复制了一份