zoukankan      html  css  js  c++  java
  • JavaScript深度克隆(递归)

    今天在深度理解JQuery源码时,剖析extend时:

    jQuery.extend = jQuery.fn.extend = function() {
           //...
    }

    感觉该方法的一部分功能与深度克隆类似,恰好深度克隆的代码还没整理上传;

    借此机会先上传一份深度克隆的代码;

    代码若有不足之处,希望各位看官评论提示,一起学习进步。

    // 遍历对象 for(var prop in obj)
    // 1.判断是不是原始值    typeOf() object 
    // 2.判断是数组还是对象 instanceof toString constructor
    // 3.建立相应的数组或对象
    //递归
    function deepClone(origin, target){
        var target = target || {},
            toStr = Object.prototype.toString,
            arrStr = "[object Array]";
            objStr = "[object Object]";
        for(var prop in origin){
    
            //object.hasOwnProperty(attribute)判断attribute是不是自己本身的属性(即不拷贝原型链上的属性)       
            if(origin.hasOwnProperty(prop)){
                if(origin[prop] !== null && typeof(origin[prop]) == 'object'){
                    //origin[prop]调用toString方法的返回值是[object Array],target则赋值[],即为数组
                    if(toStr.call(origin[prop]) == arrStr){
                        target[prop] = toStr.call(target[prop]) == arrStr ? target[prop] : [] ;
                    }else{
                        target[prop] = toStr.call(target[prop]) == objStr ? target[prop] : {};
                    }
                    //遇到引用值,应用递归实现深度克隆
                    deepClone(origin[prop],target[prop]);
                }else{
                    target[prop] = origin[prop];
                }    
            }
        }
        return target;
    }

    简单的内容,测试代码很糙,有强迫症小哥哥小姐姐自己写一份吧,嘻嘻

    var obj = {
        name : "abc",
        age : 123,
        card : ['visa','master'],
        wife : {
            name : "bcd",
            son : {
                name : "aaa"
            }
        }
    }
    var obj1 = {}
    deepClone(obj,obj1);
  • 相关阅读:
    element 步骤条steps 点击事件
    element-ui的rules中正则表达式
    从master分支创建自己的分支
    2.1 系统调用io实现原理
    2-3形参和实参
    2-2函数
    2-1.编译和链接
    linux高编信号-------setitimer()、getitimer()
    linux高编IO-------有限状态机编程原理(mycpy)
    linux高编线程-------线程同步-条件变量
  • 原文地址:https://www.cnblogs.com/ZheOneAndOnly/p/9865001.html
Copyright © 2011-2022 走看看