深拷贝与浅拷贝

Posted xwh7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深拷贝与浅拷贝相关的知识,希望对你有一定的参考价值。

总所周知,传参 或 使用变量给另一个变量赋值时,如果是基本数据类型(null,number,undefined,string,boolean)则是直接复制,但是如果是非基本数据类型(array,function,object等),则是复制对应的引用。
浅拷贝指的是只会复制第一层对象,但是当对象是引用类型时,实质复制的是其引用,当引用指向的值变化时也会随之变化。
深拷贝复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。深拷贝后的对象与原来的对象是完全隔离的,互不影响,对一个对象的修改并不会影响另一个对象。

一般写代码都是用的JSON.parse(JSON.stringify(obj))
实现一个深拷贝:

function deepClone(obj) { //递归拷贝
    if(obj === null) return null; //null 的情况
    if(obj instanceof RegExp) return new RegExp(obj);
    if(obj instanceof Date) return new Date(obj);
    if(typeof obj !== ‘object‘) {
        //如果不是复杂数据类型,直接返回
        return obj;
    }
    /**
     * 如果obj是数组,那么 obj.constructor 是 [Function: Array]
     * 如果obj是对象,那么 obj.constructor 是 [Function: Object]
     */
    let t = new obj.constructor();
    for(let key in obj) {
        //如果 obj[key] 是复杂数据类型,递归
        t[key] = deepClone(obj[key]);
    }
    return t;
}

参考: https://github.com/YvetteLau/Blog/issues/7




以上是关于深拷贝与浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发——深拷贝与浅拷贝详解

iOS之深拷贝与浅拷贝

python 的深拷贝与浅拷贝

JavaScript深拷贝与浅拷贝

JavaSE知识集锦深拷贝与浅拷贝

深拷贝与浅拷贝详解