首页 > 编程知识 正文

js深层拷贝,js如何实现深拷贝

时间:2023-05-03 21:20:59 阅读:230307 作者:4246

最简单的办法可以使用:

JSON.parse(JSON.stringify());

但如果是面试时碰见这种问题,这样回答肯定是不行的,换一种思路,我们自己实现一个简易版:

module.exports = function clone(target) { if (typeof target === 'object') { let cloneTarget = Array.isArray(target) ? [] : {}; for (const key in target) { cloneTarget[key] = clone(target[key]); } return cloneTarget; } else { return target; }};

        但实际上这个没有对象存在循环引用的情况,即对象的属性间接或直接的引用了自身的情况,如果拷贝的值有循环引用的,则会陷入死循环,导致栈内存溢出

继续优化的话:

module.exports = function clone(target, map = new Map()) { if (typeof target === 'object') { let cloneTarget = Array.isArray(target) ? [] : {}; if (map.get(target)) { return target; } map.set(target, cloneTarget); for (const key in target) { cloneTarget[key] = clone(target[key], map); } return cloneTarget; } else { return target; }};

        这里是额外开辟一个存储空间,来存储当前对象和拷贝对象的对应关系,当需要拷贝当前对象时,先去存储空间中找,有没有拷贝过这个对象,如果有的话直接返回,如果没有的话继续拷贝,这样就巧妙化解的循环引用的问题。

这个存储空间,需要可以存储 key-value形式的数据,且 key可以是一个引用类型,我们可以选择 Map这种数据结构:

检查 map中有无克隆过的对象有 - 直接返回没有 - 将当前对象作为key,克隆对象作为value进行存储继续克隆

到这里其实也只考虑了Array和Object,但更深层次的就会更复杂,这里也不做详述了

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。