8月得进步(二):浅谈深浅拷贝🐷| 8月更文挑战
前言:首先在讲述深浅拷贝之前,我想说明两个概念--值传递和引用传递。
javascript数据类型
1,简单数据类型
:String,Number,Boolean,undefined,null,Symbol
2,引用数据类型
:Object,可细分为 Array 、函数、RegExp等
我们把简单数据存储于栈内存中,复杂数据存储于堆内存里。
而值传递就是把数据复制一份传递(基础类型),引用传递是把数据地址复制一份传递(引用数据类型)
浅拷贝
只实现了拷贝最外一层的数据,我们还是先来看代码
let personA = {
uname : '周星星',
age : 30,
sex : '男',
family : ['dad', mom', 'bro', 'sis'],
exam : {
score : 90,
rank :6,
}
}
let personB = {}
for ( let key in personA ) {
personB[key] = personA[key]
}
personA.age = 20;
personA.exam.score = 100;
console.log(personA, personB);
我们发现两个对象是一样的,但是改A第一层值并不影响B,改对象套对象中的score,会直接影响B的值,两者都变了,所以不够完善。
上述我们是通过遍历来实现的,实际上,Object.assign({}, 目标对象)
这个方法,可以直接实现上述的遍历操作,记住下面这个就好啦。
深拷贝
和浅拷贝实现的方法一样,深拷贝不过就是再遍历一次,这里我们封装一个方法,会更方便使用。而再次拷贝引用地址不同,我们改原值是不会影响复制出来的内容的。
// 如果遇到object[key]是复杂类型,再次遍历操作
function deepCopy (newObj, obj) {
for ( let key in obj ) {
// 判断是否为数组
if ( obj[key] instanceof Array ) {
newObj[key] = [];
deepCopy(newObj[key], obj[key]);
// 判断是否为对象
} else if ( obj[key] instanceof Object ) {
newObj[key] = {};
deepCopy(newObj[key], obj[key])
} else {
newObj[key] = obj[key];
}
}
}
deepCopy(newObj, obj);
实际上就是递归思想,即对属性中引用类型的值进行再遍历,直到是基本数据类型的值为止