zoukankan      html  css  js  c++  java
  • 浅拷贝和深拷贝

    1.数组的拷贝(二维数组的拷贝(深拷贝)方法,请看到最后。。。)

    //一纬数组,通过slice、concat,Array.from()方法可以实现
    var arr1 = [1, 2], arr2 = arr1.slice();
    console.log(arr1); //[1, 2]
    console.log(arr2); //[1, 2]
    arr2[0] = 3; //修改arr2
    console.log(arr1); //[1, 2]
    console.log(arr2); //[3, 2]
    

      

    //二维数组,拷贝完之后修改值,会同时改变被拷贝的数组,拷贝失败
    var arr1 = [1, 2, [3, 4]], arr2 = arr1.slice();
    console.log(arr1); //[1, 2, [3, 4]]
    console.log(arr2); //[1, 2, [3, 4]]
    arr2[2][1] = 5; 
    console.log(arr1); //[1, 2, [3, 5]]
    console.log(arr2); //[1, 2, [3, 5]]
    

    2.对象的一纬(浅)拷贝

    //通过object.assign()可实现一纬对象的拷贝
    var obj1 = {x: 1, y: 2}, obj2 = Object.assign({}, obj1);
    console.log(obj1) //{x: 1, y: 2}
    console.log(obj2) //{x: 1, y: 2}
    obj2.x = 2; //修改obj2.x
    console.log(obj1) //{x: 1, y: 2}
    console.log(obj2) //{x: 2, y: 2}
    var obj1 = {
        x: 1, 
        y: {
            m: 1
        }
    };
    var obj2 = Object.assign({}, obj1);
    console.log(obj1) //{x: 1, y: {m: 1}}
    console.log(obj2) //{x: 1, y: {m: 1}}
    obj2.y.m = 2; //修改obj2.y.m
    obj2.x = 2; //修改obj2.x
    //结果显示,obj1的一维x对应着没有改变,说明一纬拷贝成功,但是obj1的二维y.m却改变了,说明深拷贝不成功,拷贝成功的结果应该就是前后两个对象完全脱离联系,改变其中一个,另一个没变化才对
    console.log(obj1) //{x: 1, y: {m: 2}}
    console.log(obj2) //{x: 2, y: {m: 2}}
    

    3.对象的深拷贝

    //方法一,通过JSON.parse(JSON.stringify(obj)),但是有一定的弊端
    //以下是一般情况下的使用
    var obj1 = {
        x: 1, 
        y: {
            m: 1
        }
    };
    var obj2 = JSON.parse(JSON.stringify(obj1));
    console.log(obj1) //{x: 1, y: {m: 1}}
    console.log(obj2) //{x: 1, y: {m: 1}}
    obj2.y.m = 2; //修改obj2.y.m
    console.log(obj1) //{x: 1, y: {m: 1}}
    console.log(obj2) //{x: 2, y: {m: 2}}
    //以下是会出现问题的使用
    var obj1 = {
        x: 1,
        y: undefined,
        z: function add(z1, z2) {
            return z1 + z2
        },
        a: Symbol("foo")
    };
    var obj2 = JSON.parse(JSON.stringify(obj1));
    console.log(obj1) //{x: 1, y: undefined, z: ƒ, a: Symbol(foo)}
    console.log(JSON.stringify(obj1)); //{"x":1}
    console.log(obj2) //{x: 1}
    //总结:undefined、任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成 null(出现在数组中时)。
    
    //方法二(有一定瑕疵的递归),使用递归
    function deepCopy (obj) { let temp = obj.constructor === Array ? [] : {} for (let val in obj) { temp[val] = typeof obj[val] == 'object' ? deepCopy(obj[val]) : obj[val] } return temp }
    

      

      

  • 相关阅读:
    01-2制作U盘启动盘--装机助理工具
    01-1制作U盘启动盘--大白菜超级U盘启动盘制作工具
    计算机操作系统
    设置电脑系统密码以及桌面密码
    bios文字解释
    Word基本文档字体设置
    Ctrl/Alt 快捷键
    Windows键
    Laravel 5.2 四、.env 文件与模型操作
    Laravel 5.2 三、中间件、视图与 Blade 模板引擎
  • 原文地址:https://www.cnblogs.com/xuanbingbingo/p/9006430.html
Copyright © 2011-2022 走看看