深拷贝/浅拷贝
Posted 纸 飞机
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深拷贝/浅拷贝相关的知识,希望对你有一定的参考价值。
浅拷贝:将原对象或原数组的引用直接赋 给新对象,新数组。新对象/数组只是原对象的一个引用。只是增加了一个指针指向已存在的内存地址。
深拷贝:创建一个新的对象和数组,将原 对象的各项属性的“值”(数组的所有元 素 ) 拷 贝 过 来 , 是 “ 值 ” 而 不 是 “ 引 用”。是增加了一个指针并且申请了一个 新的内存,使这个增加的指针指向这个新 的内存。
注意:像“深”拷贝第一层级的对象属性或数组元素,也是浅拷贝。真正深拷贝是拷贝多层,每一级别的数据都会拷贝出来,之后就会完全独立,更改原对象,拷贝对象不会发生变化。
浅拷贝
//拷贝一层,对象是拷贝的引用类型,其他都是直接将值传递
function simpleClone(initalObj) {
var obj = {};
for (var i in initalObj) {
obj[i] = initalObj[i];
}
return obj;
}
Object.assign()方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。是浅拷贝。
Object.assign(target, ...sources)
深拷贝
//用JSON.stringify把对象转成字符串,再用JSON. parse把字符串转成新的对象。
var objl = {body: {a: 10}};
var obj2 = JSON.parse(JSON.stringfy(obj1));
递归实现拷贝
function deepClone(obj){
let objClone = Array.isArray(obj) ? [] : {};
if (obj && typeof obj === 'object') {
for(let key in obj){
if (obj[key] && typeof obj[key] === 'object'){
objClone[key] = deepClone(obj[key]);
}else{
objClone[key] = obj[key]
}
}
}
return objClone;
}
以上是关于深拷贝/浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章