浅拷贝与深拷贝的理解
对象拷贝(Object Copy)就是将一个对象的属性拷贝到另一个有着相同类类型的对象中去。在程序中拷贝对象是很常见的,主要是为了在新的上下文环境中复用对象的部分或全部 数据。JavaScript中有两种类型的对象拷贝:浅拷贝(Shallow Copy)、深拷贝(Deep Copy)。
基本类型与引用类型
(1)基本类型–名值存储在栈内存中,例如let a=1;
执行b = a 时,栈内存会新开辟一个内存,此时修改b的值也不会改变a
(2)引用数据类型–名存在栈内存中,值存在于堆内存中;
栈内存提供的是一个引用的地址指向堆内存中的值。
浅拷贝与深拷贝的区别
浅拷贝 : 只是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用,我们把这种拷贝叫做“浅拷贝”,换句话说,浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。
深拷贝 : 在计算机中开辟了一块新的内存地址用于存放复制的对象。
深拷贝,是拷贝对象各个层级的属性。
区别:浅拷贝只复制对象的第一层属性、深拷贝可以对对象的属性进行递归复制。
浅拷贝是拷贝一层,深层次的对象级别的就拷贝引用;深拷贝是拷贝多层,每一级别的数据都会拷贝出来。
浅拷贝的第一个方法
function simpleClone(obj) {
var newObj = {};
for ( var i in obj) {
newObj[i] = obj[i];
}
return newobj;
}
浅拷贝的第二个方法
S6中的Object.assign方法,Object.assign是ES6的新函数。Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是 Object.assign() 进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。
Object.assign(target, ...sources)
参数:
target:目标对象。
sources:任意多个源对象。
返回值:目标对象会被返回
深拷贝的代码实现
fucntion cloneArr(src, target){
for(let item of src){
if(Array.isArray(item)){
target.push(cloneArr(item, []));
}else if(typeof item === 'object'){
target.push(deepClone(item, {}));
}else{
target.push(item);
}
}
return target;
}
function deepClone(src, target){
const keys = Reflect.ownKeys(src);
let values = null;
for(let key of keys){
value = src[key];
if(Array.isArray(value)){
target.push(cloneArr(value, []));
}else if(typeof value === 'object'){
target.push(deepClone(value, {}));
}else{
target.push(value);
}
}
return target;
}
引用的原文地址:深拷贝与浅拷贝