不超过十行代码完成一个标准的深拷贝

摘要:我们谈到深拷贝与浅拷贝都是针对于对象或者数组这种复杂数据类型,也就是引用数据类型浅拷贝:只是对内存地址的拷贝,跟拷贝前指向的是同一块内存;深拷贝:既拷贝了内存地址,又拷贝了数据内容,是在堆内存中重新开辟了一块存储空间.

首先来理解一下深拷贝与浅拷贝的概念

我们谈到深拷贝与浅拷贝都是针对于对象或者数组这种复杂数据类型,也就是引用数据类型

  • 浅拷贝:只是对内存地址的拷贝,跟拷贝前指向的是同一块内存;
  • 深拷贝:既拷贝了内存地址,又拷贝了数据内容,是在堆内存中重新开辟了一块存储空间.
内存分为栈内存跟堆内存,对于基本数据类型会被直接存储到栈内存中,常用的比如:undefined、null、number、boolean、string,而对于数组,对象这种引用数据类型,他们的真实数据内容会被存在堆内存中,在栈内存中只会存储他们在堆内存中的地址

OK,话不多说,直接上代码:

/**
 * 深拷贝
 * @param {*} source 
 * @returns 
 */
function deepClone(source) {
    //初始化对象, 数组的构造方法指向 Array, 对象的构造方法指向 Object
    const targetObj = source.constructor === Array ? [] : {};

    //循环遍历
    for (const key in source) {
       //判断source本身是否有该属性
        if (Object.hasOwnProperty.call(source, key)) {
            //假如该属性值是object类型,那么需要递归一层
            if (source[key] && typeof source[key] === "object") {
                targetObj[key] = deepClone(source[key]);
	    } else {
		//基本数据类型直接赋值
                targetObj[key] = source[key];
            }
        }
    }
    return targetObj;
}

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://shenqiku.cn/article/FLY_12186