8月得进步(二):浅谈深浅拷贝🐷| 8月更文挑战

109 阅读2分钟

109951166232844378.jpg

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);

image.png

我们发现两个对象是一样的,但是改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);

实际上就是递归思想,即对属性中引用类型的值进行再遍历,直到是基本数据类型的值为止