JavaScript深拷贝与浅拷贝的区别
浅拷贝
浅拷贝可以通过Object.assign来实现
const objSort{ //原对象
name:'张三',
value:{
age:18
}
};
Object.assign(obj,objSort); //第一项是接收数据的对象,第二项为copy的对象
console.log(obj);
深拷贝
深拷贝此方法利用递归实现深拷贝
name:'张三',
value:{
age:18,
phone:13726378291
},
fn:function(){
},
nabs:[1,2,3,[22,33]]
}
function copy(obj){
//定义一个变量用来存储copy的数据
const newobj=null;
//判断对象是否为复杂数据类型,如果是就调用自己然后继续循环,如果不是,直接赋值
if(typeof(obj)=='object' && obj !== 'null'){
//了解instanceof是干什么用的
//它是一种检验数据类型的方法
//instanceof它是检查一个对象是否数据某个类或者构造函数,如,obj.instanceof===Array,可以检查obj是否为Aray类型。
//所以这行的意思就是通过定义了一个存储拷贝过来的值,然后通过不同的,根据参数的具体数据类型然后声明不同的类型然后存储
newobj = obj instanceof Array? [] : {};
//循环obj 中的每一项,查看obj中是否还有复杂数据类型,如果里面还有复杂数据类型,就直接利用递归再次调用copy函数
for(var i in obj){
newobj[i] = copy(obj[i])
}
}else{
newobj=obj
}
//注意函数必须要是返回值,不然会出现undefined
return newobj
}
var obj2 = copy(obj)
obj2.name = 'ok'
obj2.value.age = 20
console.log(obj,obj2)
浅拷贝与深拷贝的区别
浅拷贝:浅拷贝是指创建一个新对象,新对象的属性值与原对象的属性值相同,都指向同一内存地址,如果新对象发生变化,原对象也会发生变化。
深拷贝:深拷贝是创建一个新对象,新对象会拷贝原对象的所以数据,新对象发生变化时原对象不会发生改变。