深拷贝和浅拷贝
Posted 饮尽杯中月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深拷贝和浅拷贝相关的知识,希望对你有一定的参考价值。
原理
需要为深拷贝
深拷贝解决方案:
方法一:
但是该方法也是有局限性的:
- 函数无法拷贝
- 正则无法拷贝
- undefined无法拷贝
- symbol无法拷贝
优点:
可以实现二级以下的深拷贝
方法二:
优点:
- 可以拷贝函数
- 可以拷贝正则
- 可以拷贝undefined
缺点:
- 二级以下无法实现深拷贝
手写
当访问的obj[key]为obj对象或数组的时候,会继续按之前的对象深拷贝操作,先判断是数组还是对象,然后再次进入for循环,如此反复直到符合第一个if(不是对象或者null),将返回值可以赋值给最深层对应的result[key],这样就实现了多级的深拷贝
result[key] = deepClone(obj[key])
我们拷贝应该是oldObj上的自身属性,其对象原型上的属性不能进行拷贝
function deepClone(obj)
// 如果是 值类型 或 null,则直接return
if(typeof obj !== 'object' || obj === null)
return obj
// 定义结果对象
let copy =
// 如果对象是数组,则定义结果数组
if(obj.constructor === Array)
copy = []
// 遍历对象的key
for(let key in obj)
// 如果key是对象的自有属性
if(obj.hasOwnProperty(key))
// 递归调用深拷贝方法
copy[key] = deepClone(obj[key])
return copy
测试后面两个属性
以上是关于深拷贝和浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章