js 的deepClone

在日常的工作中, 我们经常会碰到有关于复制的问题,然而对于一些刚接触js没多久或者是对js的普通类型和引用类型没有多少概念的同学来说,可以第一反应就是直接定义个新的变量名,然后将需要被copy的常量或者对象进行简单的复制了,这样做,对于简单类型来说,没多大问题,但是对于引用类型来说,这样肯定是不对的。
在js里面,普通类型和引用类型的区别就是他们值的存储空间的问题了,普通类型是按值去值的,但是对于引用类型来说,他们是按索引取值的,所以如果我们只是简单的将复杂类型复制给一个变量的话,我们也仅仅是将引用复制给了变量,让新的变量有了访问引用类型内存的能力。下面将针对引用类型的clone进行讲解和示例演示:
引用类型包括数组,对象以及函数了, 不过对于函数的clone,一般不会遇到,这里也不进行考虑,
1:实现深拷贝的方式一:利用递归思想实现各层级属性的拷贝:
代码示例如下所示:
function deepClone(obj){
var objClone=obj instanceof Array ? []:{}
for(key in obj){
if( typeof obj[key]===‘object’){
//1:引用类型的属性也是一个引用类型的时候
objClone[key]=deepClone(obj[key]);
}else{
objClone[key]=obj[key];
}
};
return objClone
}
2:实现深拷贝的方式二:利用json.parse和json.stringify实现深拷贝:
function deepclone(obj){
let _obj=JSON.stringify(obj),
cloneObj=JSON.stringify(_obj) ;
return cloneObj;
};

3:采用第二种方式实现深拷贝的缺点:
https://www.jianshu.com/p/b084dfaad501
缺点有如下几点:
1:如果对象里面有时间对象,进行拷贝之后,时间对象会变成字符串;
2:如果对象的某个属性值是有正则表达式,则拷贝之后,该属性值是一个空的对象;
3:如果对象的某个属性值为undefined或者函数,则拷贝之后,该属性会消失;
还有些其他的影响,这里就不再罗列了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值