面试的时候,自己每次对于浅拷贝和深拷贝都是一知半解,所以特地写一篇文章来记录一下 赋值相对于值类型数据,拷贝相当于引用数据类型
一、赋值
赋值就是直接把b赋值给a,let a = b。如果b是值类型;则一切正常,如果是引用类型,则改变b中的值,a中的值也会相应改变。
二、浅拷贝
浅拷贝则是第一级的数据不会受b影响,但是第二级之后的数据会受到影响,常见方法有解构赋值。
let b = { a1: 1, a2: 2, a3: { b1: 3, b2: 4 } }
let a = { ...b }
b.a1 = 'a1'
b.a3.b1 = 'b1'
console.log(a)
{ a1: 1, a2: 2, a3: { b1: 'b1', b2: 4 } }
console.log(b)
{ a1: 'a1', a2: 2, a3: { b1: 'b1', b2: 4 } }
三、深拷贝
由此可知,浅拷贝是无法全面应用的,所以需要深拷贝,深拷贝则是将每一项的值重新引用。
- JSON.parse(JSON.stringify(obj))
- 递归
function cloneDeepDi(obj){
const newObj = {};
let keys = Object.keys(obj);
let key = null;
let data = null;
for(let i = 0; i<keys.length;i++){
key = keys[i];
data = obj[key];
if(data && typeof data === 'object'){
newObj[key] = cloneDeepDi(data)
}else{
newObj[key] = data; }
}
return newObj
}