深浅拷贝
针对引用类型而言,浅拷贝指的是复制对象的引用,即直接给引用类型赋值,如果拷贝后的对象发生变化,原对象也会发生变化。而深拷贝是真正地对对象进行拷贝,修改拷贝后的新对象并不会对原对象产生任何影响。
在JS中数据类型分为基本类型和引用类型 基本类型: number, boolean,string,symbol,undefined,null
引用类型:object 以及一些标准内置对象 Array、RegExp、String、Map、Set..
基本类型数据拷贝
基本类型数据都是值类型,存储在栈内存中,每次赋值都是一次复制的过程
var a = 12;
var b = a;
console.log(a,b); //12 12
a = 13;
console.log(a,b); //13 12
引用类型数据拷贝
只拷贝对象的一层数据,再深处层次的引用类型value将只会拷贝引用
浅拷贝
let obj = {
a : 1,
b : {
c : 2,
d : {
f : 3
}
}
}
let newObj = {
... obj};
console.log(newObj);
obj.b.c = 10;
console.log(newObj);
function cloneObj(obj){
let clone = {
};
for(let key in obj){
clone[key] = obj[key];
}
return clone;
}
let a = {
x : {
y : 1
}
}
let b = cloneObj(a);
console.log(a,b);
深拷贝
深拷贝就不会像浅拷贝那样只拷贝一层,而是有多少层我就拷贝多少层,要真正的做到全部内容都放在自己新开辟的内存里。可以利用递归思想实现深拷贝。
function cloneObj(obj) {
let clone = {
};
for (let i in obj) {
// 如果为对象则递归更进一层去拷贝
if (typeof obj[i] == "object" && obj[i] != null) {
clone[i] = cloneObj(obj[i]);
} else {
clone[i] = obj[i];
}
}
return clone;
}