原生JS实现对象数组深拷贝

原生JS实现对象数组深拷贝已经是一个老生常谈的面试题了,下面我将方法总结出来

//设置一个检查类型的函数
        function checkType(target) {
            return Object.prototype.toString.call(target).slice(8,-1)
        }
//递归遍历对象/数组元素。实现深拷贝
        function clone(target) {
//初始化一个result,作为将来要输出的结果
//我们先检查将要进行拷贝的数据类型是对象还是数组,来进行不同的初始化赋值
            let result
            let  targetType = checkType(target)
            if(targetType === 'Object') {
                result = {}
            }else if (targetType === 'Array') {
                result = []
            }else {
//如果不是对象或者数组就直接我们输出输入的值,因为只有对象或数组才存在深拷贝
               return target
            }
            for( let i in target ) {
                let value = target[i]
//使用for ... in 循环遍历其下标,通过target[i]拿到当前出去迭代中的值
//再通过上面定义的类型检查方法判断每一项的类型
//如果是对象或者数组,接着对该属性进行遍历。如果不是,就将该值赋给result的同一下标下。
                if(checkType(value) === 'Object' || checkType(value) === 'Array') {
                    result[i] = clone(value)
                }else {
                    result[i] = value
                }

            }
//最后输出result,达到深拷贝的目的
            return result
        }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言:js如何实现一个深拷贝 这是一个老生常谈的问题,也是在求职过程中的高频面试题,考察的知识点十分丰富,本文将对...
    丶chlorine阅读 3,153评论 0 2
  • 什么是深拷贝,什么是浅拷贝 说到深浅拷贝,就不得不提到另外一个知识点,那就是引用类型和基本类型以及堆和栈的区别。再...
    jeff_nz阅读 4,398评论 0 0
  • 如果您只是想知道如何实现深拷贝,请直接到页面最下方查找实现方法即可,如果希望了解其中原理,可继续往下阅读。本文转载...
    易冷zzz阅读 4,726评论 0 3
  • 预售第四十七天 到最后发现预售就是一场心理战,一场与自己内心心魔的博弈。 加微信,收定金,邀约进店等,简单的事情重...
    isha13阅读 988评论 1 1
  • 迈出图书馆大门的一刻,风,深吸一口气,凉气充盈肺部,一个寒颤后,微微颤着吐尽。抬头看,天空是灰暗的,在这灰蒙蒙的世...
    最爱那雨声阅读 1,670评论 1 0