zoukankan      html  css  js  c++  java
  • ES6中数组和对象的扩展运算符拷贝问题以及常用的深浅拷贝方法

     

      在ES6中新增了扩展运算符可以对数组和对象进行操作。有时候会遇到数组和对象的拷贝,可能会用到扩展运算符。那么这个扩展运算符到底是深拷贝还是浅拷贝呢?

    一.、使用扩展运算符拷贝

      首先是下面的代码。

    let a = [1,2,3];
    let b = [...a];
    a == b // false

      结果是false,这是很容易知道的,毕竟这个赋值操作符是有区别的。接下来将数组的值进行改变,又会怎样呢;

    let a = [1,2,3];
    let b = [...a];
    a[0] = 11;
    console.log(a); // [ 11, 2, 3 ]
    console.log(b); // [ 1, 2, 3 ]

      发现a的值发生改变之后b的值并没有发生改变。所以就是深拷贝了吗?别急,接下来将数组中的元素设为引用类型。

    复制代码
    let a = [1,2,[1,2,3]];
    let b = [...a];
    a[2][1] = 11;
    console.log(a); // [ 1, 2, [ 1, 11, 3 ] ]
    console.log(b); // [ 1, 2, [ 1, 11, 3 ] ]
    console.log(a[2] === b[2]); // true
     
    复制代码

      这次的结果就有意思了,如果改变数组中的引用类型的元素中的值,此时a和b的值都会改变,并且a和b中的引用类型全等,也就是说地址是相同的。那么为什么是这样的呢?

    二.、原因

      首先此分析仅为本人目前的认知。

      对于数组中的扩展运算符只是一个浅拷贝,仅对引用类型数据的第一层进行了拷贝,而倘若再深的层次就不会进行拷贝。

      另外对象的扩展运算符和数组是一样的。

    复制代码
    let a = {
        name : "Jyy",
        msg : {
            age : 29
        }
    }
    let b = {...a};
    console.log(a == b);    // false
    console.log(a.msg == b.msg);    // true;
    a.msg = {
        age : "28"
    }
    console.log(a); // { name: 'Jyy', msg: { age: '28' } }
    console.log(b); // { name: 'Jyy', msg: { age: 29 } }
    a.msg.age = 28
    console.log(a); // { name: 'Jyy', msg: { age: 28 } }
    console.log(b); // { name: 'Jyy', msg: { age: 28 } }
  • 相关阅读:
    ubuntu 进入临时客户会话页面 转入用户自己页面
    python hmac 加密
    docker 学习
    python try except 捕捉错误得到错误的时候的值
    python2 python3 m2crypto 安装(rsa 私钥文件加密)
    python3 requests 模块 json参数和data参数区别
    爬虫-鸡哥给大家的福利
    常用模块2
    python入门到放弃之 面向对象vs面向过程
    python放弃之 模块和包
  • 原文地址:https://www.cnblogs.com/leise/p/15005015.html
Copyright © 2011-2022 走看看