zoukankan      html  css  js  c++  java
  • 2020-11-10(拷贝问题)

    如何浅拷贝和深拷贝一个数组?

    复制引用基础数据类型,都是拷贝对应的值。
    复制引用复杂数据类型,都是拷贝对应的址。

    //如果只是想修改的时候不影响原内容,就需要进行深拷贝。

    如何实现浅拷贝?
    1、手写浅拷贝
    2、使用 Object.assign
    3、使用数组API,如 concat 或者 slice 以及拓展运算符

    使用Object.assign:

    const obj1 = {
    username: 'LiangJunrong',
    skill: {
    play: ['basketball', 'computer game'],
    read: 'book',
    },
    girlfriend: ['1 号备胎', '2 号备胎', '3 号备胎'],
    };

    const obj2 = Object.assign({}, obj1);
    obj2.username = 'jsliang'; // 修改基本类型
    obj2.skill.read = 'computer book'; // 修改二层基本类型
    obj2.skill.play = ['footboll']; // 修改二层引用类型
    obj2.girlfriend = ['之前的都是瞎吹的!']; // 修改一层引用类型

    console.log(obj1);
    // { username: 'LiangJunrong',
    // skill: { play: [ 'footboll' ], read: 'computer book' },
    // girlfriend: [ '1 号备胎', '2 号备胎', '3 号备胎' ] }
    console.log(obj2);
    // { username: 'jsliang',
    // skill: { play: [ 'footboll' ], read: 'computer book' },
    // girlfriend: [ '之前的都是瞎吹的!' ] }

    Object.assign 用于拷贝对象。它对于第一层来说,是完全拷贝;对于第二层及以上来说,是简单复制。

      使用数组API:

         Array.prototype.concat(target): concat() 是数组的一个内置方法,用户合并两个或者多个数组。这个方法不会改变现有数组,而是返回一个新

    数组。 const b = [].concat(a)

         Array.prototype.slice(start,end):slice() 也是数组的一个内置方法,该方法会返回一个新的对象。slice()不会改变原数组。

          concat b = a.slice()

         展开运算符:[...arr]可以得到一个浅拷贝新数组。

    
    

    如何实现一个深拷贝?

    1、手写深拷贝
    2、JSON.parse(JSON.stringify())
    3、第三方库 lodash,jQuery等。

    JSON.parse(JSON.stringify())局限性:
    不能存放函数或者undefined,否则会丢失函数或者undefined。
    不用存放时间对象,否则会变成字符串形式。
    不能存放RegExp,Error对象,否则会变成空对象。
    不能存放NaN,infinity,-infinity,否则会变成null。
    .....
    JSON.parse():将字符串解析成对象。
    JSON.stringify():将对象转成 json 字符串。

    Lodash:
    _cloneDeep(value):
    例如:
    npm i -S lodash
    var _ = require('lodssh');
    const obj1 = [
    1,
    'hello',
    {name:'xx'},
    [{name:'yy'}]
    ];
    const obj2 = _.cloneDeep(obj1);
    obj2[0]= 2;
    obj2[1] = 'hi';
    obj2[2].name = 'xx2';
    obj2[3][0].name = 'xx2';
    console.log(obj1);
    console.log(obj2);//这里打印出来的值都不一样哦


    jQuery方法:
    使用 extend()进行深拷贝。

    参考链接:https://juejin.im/post/6893314344751202317

  • 相关阅读:
    poj 3126 Prime Path
    poj 2255 Tree Recovery
    spoj 7259 LITE
    poj 1742 Coins
    poj 1915 Knight Moves
    poj 2352 Stars
    【祝贺】gooogleman嵌入式开发板联盟图标设计完成,Let me Show!
    【讨论】TE6410/OK6410 开发板dnw c0008000是什么意思, ?
    【讨论】为什么我的300W摄像头偶尔会拍照不成功?
    【探讨】关于2440 触摸屏驱动的怪异现象分析
  • 原文地址:https://www.cnblogs.com/sunnyeve/p/13953085.html
Copyright © 2011-2022 走看看