码迷,mamicode.com
首页 > 其他好文 > 详细

深拷贝与浅拷贝

时间:2020-07-03 01:18:19      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:one   array   完全   fun   rip   for   null   turn   regex   

总所周知,传参 或 使用变量给另一个变量赋值时,如果是基本数据类型(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

深拷贝与浅拷贝

标签:one   array   完全   fun   rip   for   null   turn   regex   

原文地址:https://www.cnblogs.com/xwh7/p/13227843.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!