对象深拷贝

作者: 开着五菱宏光的小白 | 来源:发表于2020-08-22 11:43 被阅读0次
function deepClone(obj) {
    if (!obj || typeof obj !== 'object') {
        return obj
    }
    let result = Array.isArray(obj) ? [] : {}
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            if (obj[key] && typeof obj[key] === 'object') {
                result[key] = deepClone(obj[key])
            } else {
                result[key] = obj[key]
            }
        }
    }
    return result
}

调用方式为 obj.deepClone()

function deepClone() {
    if (this && typeof this !== 'object' || Object.keys(this).length !== 0) {
          return this
    }
    let toString = Object.prototype.toString
    let result = determine(this) == 'Array' ? [] : {}
    for (key in this) {
          if (this.hasOwnProperty(key)) {
              if (this[key] && determine(this[key]) == 'Object' || determine(this[key]) == 'Array') {
                  result[key] = this[key].deepClone()
              } else {
                  result[key] = this[key]
              }
          }
    }
    function determine(str) {
        return toString.call(str).split(' ')[1].split(']')[0]
    }
    return result
}

深拷贝,防止递归引用栈溢出

function deepClone(obj, hash = new Map()) {
        // obj值为null或undefind
        if (obj == null) return obj
        // 如果值不为对象就返回
        if (obj instanceof RegExp) return new RegExp(obj)
        if (obj instanceof Date) return new Date(obj)
        if (typeof obj != 'object') return obj
        if (hash.has(obj)) return hash.get(obj)
        let newObj = new obj.constructor
        hash.set(obj, newObj)
        for (let key in obj) {
            if (obj.hasOwnProperty(key)) {
                newObj[key] = deepClone(obj[key], hash)
            }
        }
        return newObj
}

相关文章

  • 2018-10-10函数基础

    深拷贝和浅拷贝 深拷贝 copy.deepcopy(对象)浅拷贝 copy.copy(对象)深拷贝: 将对象对应的...

  • java 对象的拷贝

    拷贝:即复制 对象拷贝:即对象复制 java 对象拷贝分类:浅拷贝、深拷贝 java 对象的浅拷贝和深拷贝针对包含...

  • 2018-10-10day9函数基础

    1.浅拷贝、深拷贝 copy.copy(对象):浅拷贝copy.deepcopy(对象):深拷贝""" """拷贝...

  • 深拷贝和浅拷贝不同

    浅拷贝:指针(地址)拷贝,不会产生新对象深拷贝:内容拷贝,会产生新对象 非容器类对象的深拷贝、浅拷贝 非容器类对象...

  • 前端笔记(二) 对象的深浅拷贝,函数的防抖与节流,函数柯里化 ,

    对象的深浅拷贝 对象的深拷贝与浅拷贝的区别: 浅拷贝:仅仅复制对象的引用, 而不是对象本身。 深拷贝:把复制的对象...

  • 深浅拷贝,面向对象,Symbol,Set,Map

    一:浅拷贝与深拷贝对象的浅拷贝:浅拷贝是对象共用的一个内存地址,对象的变化相互影响。对象的深拷贝:简单理解深拷贝是...

  • iOS - copy与mutableCopy

    浅拷贝与深拷贝 浅拷贝:指针拷贝,不产生新的对象,源对象的引用计数器+1 深拷贝:对象拷贝,会产生新的对象,源对象...

  • 深拷贝浅拷贝

    1.拷贝可变对象 深拷贝后浅拷贝可变对象,都是内存复制。 输出结果: 2.拷贝不可变对象 浅拷贝是指针拷贝,深拷贝...

  • 开发中常用的JS知识点集锦

    索引 1、对象深拷贝 2、网络图片转base64, 在线图片点击下载 3、对象深拷贝 4、对象深拷贝 5、对象深拷...

  • 面试题iOS

    面试blog 1、深拷贝浅拷贝:浅拷贝就是拷贝对象的指针,而不复制引用对象本身;深拷贝就是拷贝引用对象本身;浅复制...

网友评论

    本文标题:对象深拷贝

    本文链接:https://www.haomeiwen.com/subject/vkcvjktx.html