深拷贝和浅拷贝的实现
程序员文章站
2022-04-27 08:44:21
...
一、深拷贝和浅拷贝
首先我们要明白一点,js中数据类型分为:
- 基本数据类型 (Number, String, Boolean, Null, Undefined, Symbol)
- 对象数据类型 ( Object )
引用数据类型的值是保存在栈内存和堆内存中的对象。栈区内存保存变量标识符和指向堆内存中该对象的指针。当寻找引用值时,解释器会先寻找栈中的地址。然后根据地址找到堆内存的实体。
所以深拷贝和浅拷贝的根本区别在于:
浅拷贝:只复制了指向堆内存中的内存地址,而并不是赋值对象本身,复制的变量和原变量都指向同一个内存地址。一旦数据发生改变,指向该内存地址的变量都会跟着改变。
深拷贝:深拷贝是复制了整个对象本身,同时新对象和旧对象不是同一个内存地址,二者互不影响。
二、深拷贝,浅拷贝的实现
浅拷贝的实现:
- 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判断对象是否为多层,这样可以实现复杂对象的深拷贝了。
总结
深拷贝可以通过递归的方式解决对象嵌套的拷贝问题。
上一篇: php与Open Flash Chart多报表切换例子
下一篇: 如何压缩一段文本后存入mysql中