• js深拷贝与浅拷贝


    在 JS 中有一些基本类型像是Number、String、Boolean,而对象就是像这样的东西{ name: 'star', email: "123@163.com" },对象跟基本类型最大的不同就在于他们的传值方式。

    基本类型是按值传递,像是这样:在修改a时并不会改到b

    var a = 25;
    var b = a;
    b = 18;
    console.log(a);//25
    console.log(b);//18
    

    但对象就不同,对象传的是按引用传值:

    var obj1 = { a: 10, b: 20, c: 30 };
    var obj2 = obj1;
    obj2.b = 100;
    console.log(obj1);
    // { a: 10, b: 100, c: 30 } <-- b 被改到了
    console.log(obj2);
    // { a: 10, b: 100, c: 30 }
    

    复制一份obj1叫做obj2,然后把obj2.b改成100,但却不小心改到obj1.b,因为他们根本是同一个对象,这就是所谓的浅拷贝。

    要避免这样的错误发生就要写成这样:

    var obj1 = { a: 10, b: 20, c: 30 };
    var obj2 = { a: obj1.a, b: obj1.b,
    c: obj1.c };
    obj2.b = 100;
    console.log(obj1);
    // { a: 10, b: 20, c: 30 } <-- b 沒被改到
    console.log(obj2);
    // { a: 10, b: 100, c: 30 }
    
    

    这样就是深拷贝,不会改到原本的obj1。

    浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

  • 相关阅读:
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    [转载]jquery版结婚电子请帖
    [转载]jquery版小型婚礼(可动态添加祝福语)
    maven向本地仓库导入jar包(处理官网没有的jar包)
    Maven的POM.xml配置大全
    Linux使用手册-时区和时间设置
    Fedora中允许mysql远程访问的几种方式
    [Keygen]IntelliJ IDEA 14.1.7
  • 原文地址:https://www.cnblogs.com/lxystar/p/9897078.html
Copyright © 2020-2023  润新知