JS深复制-支持基本类型/引用类型/Symbol/Error/Date/RegExp/函数-并正确处理循环引用

1.    JSON方法

JSON.parse(JSON.stringify(target))

缺点:不可序列化属性(函数,Error对象等等)会被忽略,constructor丢失,原型链丢失

 

2. 递归复制

参照https://github.com/pvorb/clone ,写了个伪代码

(1)支持复制 基本类型/对象/数组/Symbol/Error/Date/RegExp/function  ,其中function为浅复制

(2)支持对 包含循环引用的对象 的复制

(3)校正constructor并包含原型链

function clone(parent) {
    //存储已经复制过的键,仅包含引用类型
    //用于检查是否存在循环引用 
    var allParents = []
    var allChildren = []

    //返回复制值 
    function _clone(parent) {
        var child //复制的内容暂存于此
        //以下判断 parent类型

        //一 基本类型,Symbol类型,null, 函数(浅复制): 
        // if (typeof parent != 'object') {
        //     return parent;  //基本类型直接返回
        // }

        //二 引用类型
        //若为array类型 
        //child=[]
        //若为Object类型 
        //child={}
        // 1.设置child的constructor及prototype
        // var proto = Object.getPrototypeOf(parent);
        // child = Object.create(proto);
        // 2.检查是否是循环引用并储存
        // var index = allParents.indexOf(parent);
        // if (index != -1) {
        //   return allChildren[index];  //发现以前复制过这个键,直接返回当前复制时的值
        // }
        // allParents.push(parent);
        // allChildren.push(child);
        // 3.递归调用,进行赋值
        // for (var i in parent) {
        //     child[i] = _clone(parent[i])
        // }
        // 

        //三 其它引用类型
        //RegExp类型  child=new RegExp(parent.source, __getRegExpFlags(parent))
        //Date类型   child = new Date(parent.getTime())
        //Error类型  child = Object.create(parent);

        //四 尝试在引用类型中复制Symbol类型  
        //var symbol=Object.getOwnPropertySymbols(parent);
        //对其进行遍历  
        //var item=symbol[i]
        //child[item]=_clone(parent[item])
        return child
    }
    return _clone(parent)
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值