• JS数组和对象的浅拷贝和深拷贝


    共勉~

    在许多编程语言中,传递参数和赋值是通过值的直接复制或者引用复制完成的。在JavaScript中,对于值是直接进行复制还是引用复制在语法上是没有区别的,完全是根据值的类型来决定的。

    在JavaScript中,简单值总是通过值的直接复制来进行赋值传递的(null,undefined,字符串,数字,布尔,symbol),而复合值(对象(包括数组等)和函数)总是通过引用复制的方式来进行赋值和传递的。

    下面的例子能加深理解:

    var a = 1;
    var b = a;
    b++;
    a; //1
    b; //2
    
    var c = [1,2];
    var d = c;
    d.push(3);
    c; //[1,2,3]
    d; //[1,2,3]

    数组的浅拷贝

    上面例子对于数组的赋值操作就是数组的浅拷贝,不难发现问题当一个数组改变的时候,其他赋值的数组也会改变,在很多类似备份的情况中,这并不是我们想要的结果。

    var c = [1,2];
    var d = c;
    d.push(3);
    c; //[1,2,3]
    d; //[1,2,3]

    数组的深拷贝

    我们可以通过两种方法来实现数组的深拷贝:

    var a = [1,2,3];
    
    var b = a.slice(0);
    
    var c = a.concat();
    
    b.push(4);
    
    c.push(5);
    
    a; //[1,2,3]
    b; //[1,2,3,4]
    c; //[1,2,3,5]

    对象的浅拷贝

    相对来说数组的拷贝比较简单,而对象的浅拷贝我们也可以简单实现:

    function easyClone(Obj) {
        var objNew = {};
        for ( var i in Obj) {
            objNew[i] = Obj[i];
        }
        return objNew;
    }

    其实就是将每个原对象的属性和值复制到新对象上去,当然我们也可以使用Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象,同时Object.assign() 也是浅拷贝,有兴趣的同学可以看看。

    浅拷贝因为没有递归循环检查对象的每个值是否是对象,而是直接进行了赋值,所以如果某个值是对象的时候就会出现问题,所以在一般情况下我们需要用深拷贝来进行备份。

    对象的深拷贝

    最简单的深拷贝:

    b = JSON.parse( JSON.stringify(a) )

    局限性:

    • 无法复制函数
    • 原型链没了,对象就是object,所属的类没了。

    其实简单的深拷贝只需要我们递归调用浅拷贝就可以了:

    function deepCopy(obj) {
      var objNew = objNew || {};
      for (var i in obj) {
        if (typeof p[i] === 'object') {
          objNew[i] = (p[i].constructor === Array) ? [] : {};
          deepCopy(obj[i], objNew[i]);
        } else {
           objNew[i] = obj[i];
        }
      }
      return objNew;
    }

    当然JQ的jQuery.extend()方法也可以做到深拷贝和浅拷贝:详情可以参考这篇文章:

    浅拷贝深拷贝之jQuery中的$.extend分析

  • 相关阅读:
    拉普拉斯------拉普拉斯算子
    拉普拉斯------拉普拉斯变换
    傅里叶------傅里叶变换
    傅里叶------傅里叶级数
    深度学习笔记------卷积训练
    深度学习笔记------卷积神经网络
    计算机图形学笔记------直线的扫描转换
    深度学习笔记------神经网络
    深度学习笔记------softmax回归
    深度学习笔记------线性回归
  • 原文地址:https://www.cnblogs.com/xiaoloulan/p/6929546.html
Copyright © 2020-2023  润新知