什么是深浅拷贝
首先我们要明白一点,js中数据类型分为:
- 基本数据类型 (Number, String, Boolean, Null, Undefined, Symbol)
对象数据类型 ( Object )
引用数据类型的值是保存在栈内存和堆内存中的对象。栈区内存保存变量标识符和指向堆内存中该对象的指针。当寻找引用值时,解释器会先寻找栈中的地址。然后根据地址找到堆内存的实体。
浅拷贝:
- 浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。
可以使用 for in、 Object.assign、 扩展运算符 … 、Array.prototype.slice()、Array.prototype.concat() 等
代码展示:
let obj = {
name:"ls",
sex:"男",
arr:[1,2,3]
};
let obj1=obj;
obj1.arr[0]=10;
console.log(obj.arr[0]);//10
//Object.assign(目标对象, 源对象, ···)
let obj1 = {a:1};
let obj2 = {b:{d:2}};
let obj3 = {c:3};
Object.assign(obj3,obj1,obj2);
console.log(obj3);//{b: {d:2}};
console.log(obj3);//{a: 1,b: {d:2},c: 3}
obj3.b.d = 99;
console.log(obj3);//{a: 1,b: {d: 99},c: 3}
console.log(obj2);//{b: {d:99}};
深拷贝:
- 深拷贝和浅拷贝是针对复杂数据类型(对象及数组)来说的,浅拷贝只拷贝一层,而深拷贝是层层拷贝。
深拷贝复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。
深拷贝后的对象与原来的对象是完全隔离的,互不影响,对一个对象的修改并不会影响另一个对象。
代码展示:
//使用递归去深拷贝
function deepClone(obj){
var objs = Array.isArray(obj)?[]:{};
if(obj&&typeof obj==="object"){
for(key in obj){
if(obj.hasOwnProperty(key)){
if(obj[key]&&typeof obj[key]==="object"){
objs[key] = deepClone(obj[key]);
}else{
objs[key] = obj[key];
}
}
}
}
return objs;
}
//使用JSON对象去深拷贝
function deepClone(obj){
let _obj = JSON.stringify(obj);
let objClone = JSON.parse(_obj);
return objClone
}
let a=[0,1,[2,3],4],
b=deepClone(a);