对象的深拷贝

在这里插入图片描述先判断数组和对象的类型,由于使用typeof判断对象和数组都是object,就不能优先判断对象类型。由于程序是从上到下执行,那么我们只有把数组的isArray判断放前面,这样只要是数组就不会跑掉了。也就是if(Array.isArray(obj)){}
先把所有的类型判断写好,数组的类型使用isArray来判断,对象的类型就使用typeof来判断,只要是object说明就是一个对象,就方便执行对象判断里的操作。也就是else if(obj.typeof==‘object’){}
还有一种可能就是都不是引用类型,那就只有基本类型值了,基本类型值直接赋值给变量就可以。else{}
所有判断写好以后就开始写判断里面的执行语句。假如我们遇见obj是一个数组,那么数组判断true,然后我们在数组里面创建一个新数组,进行拷贝原数组再添加到新数组里,为了进行深拷贝,在拷贝过程中为了防止在这个数组里还有一层引用类型,所以我们就要对这个数组里的每一个值再传入到整个函数中判断判断每一个值是基本类型还是引用类型,是基本类型就赋值给变量然后把变量return回上一层,是引用类型的话就再进去到这个引用类型里面进行遍历,再把引用类型里面的值赋值给变量return回上一层。一层一层的返回。就完成了数组的拷贝!
if(Array.isArray(obj)){
var result=[];
for(var i =0;i<obj.length;i++){
result.push(deepClong(obj[i]));
}
}//这是数组的判断和判断里面的添加给新数组的方法。

假如遇见的obj是一个对象,和数组的操作,也是创建一个新的引用类型接收拷贝的值,也就是创建一个新的对象 ,这里需要注意的是变量名还是result。
再遍历这个对象,把这个对象每一个值都拷贝进新对象里面,为了防止对象里面的值还有引用类型,就把每一个对象的值都放进函数体里过一遍,发现没有了就在最后else那里赋值给变量返回给上一层。
else if(obj.typeof==‘object’){
var result={};
for(var i in obj){
result[i]=deepClong(obj[i]);

            }

}//这是对象的判断和判断对象里面添加到新对象的方法。
通过了两个引用类型的判断,剩下的就只有基本类型了。
通过上面两层的判断过滤,这里直接就可以把基本类型赋值给变量,然后return回上一层。
这里需要注意的是三个判断里用的都是同一个变量result,也就是使用了局部变量遮蔽全局变量的特点,当返回上一层的这一层的值是直接返回到上一层的里面的。上一层的变量值是不会受影响的。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值