Javascript中浅拷贝与深拷贝的区别

61 阅读2分钟

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)

浅拷贝与深拷贝的区别

浅拷贝:浅拷贝是指创建一个新对象,新对象的属性值与原对象的属性值相同,都指向同一内存地址,如果新对象发生变化,原对象也会发生变化。  
深拷贝:深拷贝是创建一个新对象,新对象会拷贝原对象的所以数据,新对象发生变化时原对象不会发生改变。