浅拷贝和深拷贝

98 阅读2分钟

一、浅拷贝

浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型, 拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。浅拷贝的主要作用就是只拷贝原对象的值,而不拷贝其地址,这样才能保证两个对象独立,但是如果原对象属性中有引用类型的值,则只能拷贝其地址,因为浅拷贝只能拷贝一层。

基本数据类型:

        var a = 8;
        var b = a;
        var a = 17
        console.log(a, b);//17,8

引用数据类型:

var obj1 = {
            name: 'liuxiaofeng',
            age: 23
        }
        var obj2 = obj1
        obj2.name = 'jiaxin'
        console.log(obj1, obj2);
        

打印结果:

image.png

这里可以看到浅拷贝没有拷贝引用类型的值,只是拷贝了其地址,相当于两个对象指向一个地址。

1.对象实现浅拷贝的方法,Object.assign(a,b),意思就是b把浅拷贝给a.

  var obj1 = {
            name: 'liuxiaofeng',
            age: 23
        }
        var obj2 = {}
        Object.assign(obj2, obj1)
        obj2.name = 'jiaxin'
        obj1.age = 24
        console.log(obj1, obj2);

打印结果:

image.png

2.数组浅拷贝

(1)concat()

        var arr2 = arr1.concat();
        arr1.push(4)
        console.log(arr1, arr2);

打印结果: 此时的arr2跟原来的arr1是一模一样的,改变了arr1后,arr2也是没有发生改变的,因为arr2的数据空间是一个新的地址。

image.png

(2) slice()

var arr1 = [7, 8, 9];
        var arr2 = arr1.slice();
        arr1.push(4)
        console.log(arr1, arr2);

打印结果: 与concat()一样

数组中还有引用类型的情况

var arr1 = [7, 8, 9, [4, 5, 6]];
        var arr2 = arr1.slice();
        arr1[3].push('yinyong')
        console.log(arr1, arr2);

打印结果: concat也是一样的 image.png

这就是浅拷贝,如果数据中都是基本类型数据,就是完全没有联系的两个数据,但是如果数据中引用类型数据,那两个变量还是有一定的联系。 所谓浅拷贝,也就是说,数组或对象中的值如果是基本类型数据,那拷贝后的数据和原数据是完全没有关联,且互不影响的两个数据,如果数组或对象的值是引用类型数据的话,拷贝后的数组或对象中的引用类型的值跟原数据中的引用类型的值,还是存在共享同一地址的现象。

二、深拷贝

深拷贝可以不管数据中的值是什么类型的数据,拷贝后的新数据跟原数据没有关系。

1.利用JSON数据和JSON字符串之间进行转换

(1)对象深拷贝

    var obj = {
            name: "liuxiaofeng",
            height: 180,
            wife: {
                name: "jiaxin",
                age: 23
            }
        }
        var str = JSON.stringify(obj);
        var pbj = JSON.parse(str);
        obj.wife.age = 18;
        console.log(obj.wife);
        console.log(pbj.wife);

打印结果:

image.png

(2)数组深拷贝

 var arr1 = [7, 8, 9, [2, 3, 4]];
        var str = JSON.stringify(arr1);
        var arr2 = JSON.parse(str);
        arr1[3].push('feng');
        console.log(arr1[3], arr2[3]);

打印结果:

image.png