js深拷贝的理解及三种深拷贝方法

因为原始类型的拷贝是传值,所以对于原始数据类型并没有深浅拷贝的区别。深拷贝是针对引用数据类型对象,数组和函数数的全拷贝,并且不会影响的原有数据单独存在。

深拷贝的使用场景:1、都是复杂对象,即对象的属性还是对象

如果要赋值对象的所有属性都不是引用类型的时候,可以使用浅拷贝,遍历并复制。

实现深拷贝的方法一:递归

function deepClone(obj){

    let _obj = JSON.stringify(obj),

        objClone = JSON.parse(_obj);

    return objClone

}   

let a=[0,1,[2,3],4],

    b=deepClone(a);

a[0]=1;

a[2][0]=1;

console.log(a,b);//a:[0,1,[1,3],4],b:[0,1,[2,3],4]
实现深拷贝的方法二:JSON对象的parse和stringify

function deepClone(obj){

    let _obj = JSON.stringify(obj),

        objClone = JSON.parse(_obj);

    return objClone

}   

let a=[0,1,[2,3],4],

    b=deepClone(a);

a[0]=1;

a[2][0]=1;

console.log(a,b);//a:[0,1,[1,3],4],b:[0,1,[2,3],4]

实现深拷贝的方法三:JQ的extend方法

    $.extend( [deep ], target, object1 [, objectN ] )

    deep表示是否深拷贝,为true为深拷贝,为false,则为浅拷贝

    target Object类型 目标对象,其他对象的成员属性将被附加到该对象上。

    object1  objectN可选。 Object类型 第一个以及第N个被合并的对象。
let a=[0,1,[2,3],4],

    b=$.extend(true,[],a);

a[0]=1;

a[2][0]=1;

console.log(a,b);//a:[0,1,[1,3],4],b:[0,1,[2,3],4]

理解借鉴地址:https://www.cnblogs.com/echolun/p/7889848.html

你可能感兴趣的:(js深拷贝的理解及三种深拷贝方法)