原生JavaScript对象复制

简单深度复制

    var a = {
        a:1,
        b:2,
        c:{
            d:4,
            e:5
        },
        f:6
    };
    function simpleDeepClone(obj){
        return JSON.parse(JSON.stringify(obj));
    }
    var c = simpleDeepClone(a);
    console.log(a); //{a:1, b:2, c:{d:4, e:5}, f:6}
    console.log(c); //{a:1, b:2, c:{d:4, e:5}, f:6}

    a.g = 4;
    console.log(a); //{a:1, b:2, c:{d:4, e:5}, f:6, g:4}
    console.log(c); //{a:1, b:2, c:{d:4, e:5}, f:6}

    c.h = 5;
    console.log(a); //{a:1, b:2, c:{d:4, e:5}, f:6}
    console.log(c); //{a:1, b:2, c:{d:4, e:5}, f:6, h:5}

对象合并或者称为浅复制(对象只是复制应用,原对象改变会影响新对象,新对象改变不会影响原来的对象)

        // 会改变第一个对象参数的值
    function mergeClone() {
        var len = arguments.length;
        var target;
        if (typeof arguments[0] === 'object')
            target = arguments[0];
        else
            target = arguments[0] = {};
        for (var index = 1; index < len; index++) {
            if (typeof arguments[index] === 'object')
                target = Object.assign(target, arguments[index])
        }
        return target;
    }


    // 不会改变原有参数的值
    function mergeClone() {
        var target = {};
        for (var index in arguments) {
            if (typeof arguments[index] === 'object')
                target = Object.assign(target, arguments[index])
        }
        return target;
    }

        // 上面的复制改变新对象对原有对象没有影响,但改变原有对象对新对象有影响
        var a = {a:1, b:2, c:{d:4, e:5 }, f:6 };
        var c = {hi: 'hi', hello: 'world'};
        var newObj = mergeClone(a, c);
    console.log(newObj) // {a:1, b:2, c:{d:4, e:5}, f:6, h:5, hello: 'world', hi: 'hi'}
        // 在上面的consloe语句前面怎么加如下语句后打印出来的结果是:
        a.c.d = 123;
    console.log(newObj) // {a:1, b:2, c:{d:123, e:5}, f:6, h:5, hello: 'world', hi: 'hi'}
        c.lol = 456;
    console.log(newObj) // {a:1, b:2, c:{d:123, e:5}, f:6, h:5, hello: 'world', hi: 'hi'}
        // 也就是说如果合并的对象里的属性是对象,他只是获取引用

高级深度复制

    // 聪明的你早就看来了这个只是上面2个函数的合体
    function deepClone() {
        var target = {};
        for (var index in arguments) {
            if (typeof arguments[index] === 'object')
                target = Object.assign(target, arguments[index])
        }
        return JSON.parse(JSON.stringify(target));
    }
        // 但是这样就完全可以旧对象中的子对象对变化对新对象的影响
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,908评论 25 708
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,092评论 6 13
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,200评论 30 471
  • 今天早上我们一行四人从咸阳袁家村出发,沿着连霍高速一路向西,经历了300公里的行驶到达了我们的第一站-天...
    珊珊来驰阅读 235评论 0 1
  • 公司的项目会使用到友盟的微信分享,客户最近反馈了一个问题:在分享我们app里面的文章时想将文章中的几句话作为分享的...
    逗憨de逗阅读 667评论 1 0