欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

深拷贝和浅拷贝的实现

程序员文章站 2022-04-27 08:44:21
...

一、深拷贝和浅拷贝

首先我们要明白一点,js中数据类型分为:

  1. 基本数据类型 (Number, String, Boolean, Null, Undefined, Symbol)
  2. 对象数据类型 ( Object )

引用数据类型的值是保存在栈内存和堆内存中的对象。栈区内存保存变量标识符和指向堆内存中该对象的指针。当寻找引用值时,解释器会先寻找栈中的地址。然后根据地址找到堆内存的实体。
深拷贝和浅拷贝的实现

所以深拷贝和浅拷贝的根本区别在于:
浅拷贝:只复制了指向堆内存中的内存地址,而并不是赋值对象本身,复制的变量和原变量都指向同一个内存地址。一旦数据发生改变,指向该内存地址的变量都会跟着改变。
深拷贝:深拷贝是复制了整个对象本身,同时新对象和旧对象不是同一个内存地址,二者互不影响。
深拷贝和浅拷贝的实现

二、深拷贝,浅拷贝的实现

浅拷贝的实现:

  1. Object.assign():将多个可枚举属性的值从一个或者多个源对象复制到目标对象,并且返回目标对象。
const source = { name: 'wym', age: 18 };
const target = Object.assign({}, source);
target.name = 'www';
console.log(target);//{ name: 'www', age: 18 }
console.log(source);//{ name: 'wym', age: 18 }

但是需要注意,当对象只有一层时,使用assign是深拷贝。

浅拷贝的实现

当需要执行深拷贝,并且对象不只一层时,我们需要利用递归的方法手写深拷贝的方法。

let obj1 = {
    name: 'wym',
    arr: [1, 2, 3],
    student: {
        age: 18,
        height: 1.88
    }
}
let obj2 = {};
function deepCopy(target, source) {
	for(let key in source) {
		if(source[key] instanceof Object) {
			let newType = new source[key].constructor;
			target[key] = newType;
			deepCopy(target[key], source[key]);
		}else {
			target[key] = source[key];
		} 
	}
	return target;
}
deepCopy(obj2, obj1);
obj1.name = 'wwwww';
console.log(obj1);//{ name: 'wwwww', arr: [ 1, 2, 3 ], student: { age: 18, height: 1.88 } }
console.log(obj2); //{ name: 'wym', arr: [ 1, 2, 3 ], student: { age: 18, height: 1.88 } }

通过instanceof判断对象是否为多层,这样可以实现复杂对象的深拷贝了。

总结

深拷贝可以通过递归的方式解决对象嵌套的拷贝问题。

相关标签: javascript