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);
复制代码
posted @   他乡踏雪  阅读(588)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示