• 深拷贝 浅拷贝


    1.在拷贝时,如果如下

    1
    2
    3
    4
    5
    let arr={
        a:1,
        b:2
    }
    let arr1 = arr //直接赋值

        这样只是将arr所记载的地址赋值给arr1,这样改变arr1里面的值,arr也会同步改变,毕竟这里面存的只是一个地址,控制的是同一个变量,

    它算不上拷贝。如果在使用对象比如redux中使用,会出错。

    2.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    let arr={
        a:1,
        b:2
    }
    let arr1=Object.assign({},arr)
     
    或者
     
    let arr={
        a:1,
        b:2
    }
    let arr1={...arr}

      这样的话,拷贝只能是将其第一层的地址改变,在对象没有嵌套关系的话,这样也没错,但是

       

    1
    2
    3
    4
    5
    6
    7
    8
    9
    let arr={
        a:1,
        b:2,
        c:{  // 嵌套
            fer:1,
            res:[1,2,3]
        }
    }
    let arr1={...arr}

      在这样的嵌套关系的时候,你要是需要改变arr1里面对象名为c的时候有可能就会出错,因为 arr1.c 和 arr.c 共用一个地址,在只改变第一层地址而没深入的话,这样出错也没毛病,要进行浅拷贝除了上述两种方法,你还可以使用copy()函数(如list.copy())

    3

    1
    2
    3
    4
    5
    6
    7
    8
    9
    let arr={
        a:1,
        b:2,
        c:{
            fer:1,
            res:[1,2,3]
        }
    }
    let arr1=JSON.parse(JSON.stringify(arr))

      如果你是要使用这种方式就是属于深拷贝,这种方式就是把里面所有对象和数组地址都改变了,arr1将arr值完全拷贝但是地址又相同,简单就是其实就是将对象中的数组、子对象进行深度递归遍历,直到其不是引用类型位置再进行复制,这样即使改变了其中一个的值,也不会影响到另一个。优点是 ==》可以更深层的解析数据,缺点是如果是一个庞大的复杂数据类型的话,每次的更新数据都会重新去解析,是一个非常耗时的工程。性能会受到影响。

  • 相关阅读:
    经典面试题(二)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
    ctype.h库函数
    结构体大小与内存对齐问题
    整数v,从高位到低位,取c位数,得到最大数 (其中:v>=10^c)
    32位与64 位下各类型长度对比
    C++容器类
    笔试题 相对位置不变的正负数排序
    composer 下载安装
    nginx 多进程 + io多路复用 实现高并发
    go 成长路上的坑(1)
  • 原文地址:https://www.cnblogs.com/menggege/p/13716092.html
Copyright © 2020-2023  润新知