真正的Javascript深拷贝(不仅拷贝多个层级的值,还拷贝了类型)

本文介绍了一种JavaScript中实现深拷贝的有效方法,通过自定义函数递归地复制对象和数组,确保源对象不受副本修改的影响。同时解决了拷贝过程中类型的保持问题。

参考文章:

1、js如何判断一个对象是不是Array?

2、实现JS数组的深拷贝

参考文章2的深拷贝代码如下:

function getType(o)
    {
        var _t;
        return ((_t = typeof(o)) == "object" ? o==null && "null" || Object.prototype.toString.call(o).slice(8,-1):_t).toLowerCase();
    }
    function extend(destination,source)
    {
        for(var p in source)
        {
            if(getType(source[p])=="array"||getType(source[p])=="object")
            {
                destination[p]=getType(source[p])=="array"?[]:{};
                arguments.callee(destination[p],source[p]);
            }
            else
            {
                destination[p]=source[p];
            }
        }
    }
    var test={a:"ss",b:"dd",c:{d:"css",e:"cdd"}};
    var test1={};
    extend(test1,test);
    test1.c.d="change"; //改变test1的c属性对象的d属性
    alert(test.c.d);  //不影响test

  假如:

var test={a:"ss",b:"dd",c:{d:"css",e:"cdd"}};
var test1=[];//使用该方法深拷贝,必须先定义拷贝到的对象,并且初始化
extend(test1,test);
test1.c.d="change"; //改变test1的c属性对象的d属性
alert(test.c.d);  //不影响test
这样做,的确也把test的数据复制过来了,而且,修改test1.c.d也不会对test造成影响,但是接下来的问题来了,test1的类型改变了,这个时候,我们按照原类型去处理,比如使用array的push方法,就会出错了,chrome监视情况如下
代码:

Chrome对象监视

无废话,正确代码如下

Ext.namespace("GTP.BI");
GTP.BI.Util = {};

GTP.BI.Util.getType = function (o) {

    var _t;
    return ((_t = typeof (o)) == "object" ? o == null && "null" || Object.prototype.toString.call(o).slice(8, -1) : _t).toLowerCase();
};

GTP.BI.Util.copy = function (source) {
    var destination = GTP.BI.Util.getType(source) == "array" ? [] : {}; //呵呵,联想到了Ext.extend方法
    for (var p in source) {
        if (GTP.BI.Util.getType(source[p]) == "array" || GTP.BI.Util.getType(source[p]) == "object") {
            destination[p] = GTP.BI.Util.getType(source[p]) == "array" ? [] : {};
            destination[p] = arguments.callee(source[p]);
        }
        else {
            destination[p] = source[p];
        }
    }
    return destination;
}


var test = { a: "ss", b: "dd", c: { d: "css", e: "cdd"} };
var test1 = [];
test1 = GTP.BI.Util.copy(test);
test1.c.d = "change"; //改变test1的c属性对象的d属性
alert(test.c.d); //不影响test

重要说明:test1 此时也为Object,它和初始化类型毫无关系。其实这里根本就不需要初始化,当然,若是初始化了,在这里不仅深拷贝了值,而且也拷贝了类型,将test1的初始化值和类型完全覆盖(这样的才是深拷贝么,哇哈哈)。

相对于参考文章二,其实做出的修改很小,主要是添加了命名空间(使用Extjs),另外,改了一下函数,在实现拷贝的时候,不需要传入要拷贝到的地方(destination),而采取动态生成destination对象,解决使用参考文章2中以下问题:

1、拷贝时需要初始化destination类型

2、若初始化错destination类型,会导致拷贝后类型变化的问题。

转载于:https://www.cnblogs.com/piaolingzxh/archive/2012/07/17/2595794.html

标题基于Python的自主学习系统后端设计与实现AI更换标题第1章引言介绍自主学习系统的研究背景、意义、现状以及本文的研究方法和创新点。1.1研究背景与意义阐述自主学习系统在教育技术领域的重要性和应用价。1.2国内外研究现状分析国内外在自主学习系统后端技术方面的研究进展。1.3研究方法与创新点概述本文采用Python技术栈的设计方法和系统创新点。第2章相关理论与技术总结自主学习系统后端开发的相关理论和技术基础。2.1自主学习系统理论阐述自主学习系统的定义、特征和理论基础。2.2Python后端技术栈介绍DjangoFlask等Python后端框架及其适用场景。2.3数据库技术讨论关系型和非关系型数据库在系统中的应用方案。第3章系统设计与实现详细介绍自主学习系统后端的设计方案和实现过程。3.1系统架构设计提出基于微服务的系统架构设计方案。3.2核心模块设计详细说明用户管理、学习资源管理、进度跟踪等核心模块设计。3.3关键技术实现阐述个性化推荐算法、学习行为分析等关键技术的实现。第4章系统测试与评估对系统进行功能测试和性能评估。4.1测试环境与方法介绍测试环境配置和采用的测试方法。4.2功能测试结果展示各功能模块的测试结果和问题修复情况。4.3性能评估分析分析系统在高并发等场景下的性能表现。第5章结论与展望总结研究成果并提出未来改进方向。5.1研究结论概括系统设计的主要成果和技术创新。5.2未来展望指出系统局限性并提出后续优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值