JavaScript浅复制和深复制的区别

来源:互联网 发布:steam更新网络连接 编辑:程序博客网 时间:2024/04/28 13:05

    理解JavaScript浅复制和深复制之前,我们需要先了解js的数据类型:基本数据类型和引用类型。

    基本数据类型:undifined, null, Number, String ,Boolean,这一些是存放在栈stack中的。

    引用数据类型:Object, Array等,这一些事存放在堆heap中的。

    1.浅复制

    看如下代码:

var myObj1={    name:"Scott"};var myObj2=myObj1;

    这一种方式就是浅复制,这样做的问题是,myObj1是一个引用类型的对象,我们将myObj1直接赋值给myObj2的话,只是将引用赋值给了myObj2,这样myObj2myObj1都指向相同的内存地址。这样的话,如果我们重新给myObj2赋值的话,myObj1的值也会改变。

myObj2.name="123";console.log(myObj1.name); //结果:123



    2.深复制

    但我们开发过程中,可能并不想让myObj2myObj1有这种联系,这个时候就需要深复制了。那么如何进行深复制呢?

    i).最简单的办法:

var myObj1={   name:"Scott"};var myObj2={};myObj2.name=myObj1.name;
    因为String类型是基本数据类型,这样做的话,改变myObj2的值,并不会影响myObj1。但如果对象很复杂的话,这一种方式将非常麻烦。

    ii).JSON.parse和JSON.stringify()

    

var myObj1={    name:"Scott" }var myObj2=JSON.parse(JSON.stringify(myObj1));

    iii).其他方式
一些js库都提供了相关功能,比如Jquery的$.extend()

var myObj1={    name:"Scott"};var myObj2=$.extend(true,{},myObj1);


0 0
原创粉丝点击