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

  • 不超过十行代码完成一个标准的深拷贝已关闭评论
  • 155 次浏览
  • A+
所属分类:Web前端
摘要

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


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

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

内存分为栈内存跟堆内存,对于基本数据类型会被直接存储到栈内存中,常用的比如: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; }