深拷贝与浅拷贝, 手写深拷贝(不考虑原型链)

news/2024/7/19 16:32:43 标签: js, javascript

说明: 浅拷贝对于深层对象引用无法处理

1. 一般使用Object.assign 即可实现单层对象的深拷贝, 但对于多层对象无法生效
2. 一般通过JSON.parse() 和JSON.stringfy() 即可实现简单的深拷贝, 但对于正则, 日期对象等无法完整拷贝如下图所示

在这里插入图片描述

实现深拷贝

1. 简单的深拷贝

javascript">	/*
		简单的深拷贝, 对于函数, 正则等无法处理
	*/
	function deepClone (obj) {
		let newObj 
		if (typeof obj === 'object') {
			newObj = {}
			for(let i in obj) {
				newObj[i] = deepClone(obj[i])
			}
		} else if (typeof obj === 'array') {
			newObj = []
			for(let i = 0; i < obj.length; i++) {
				newObj[i] = deepClone(obj[i])
			}
		} else {
			newObj = obj
		}
		return obj
	}

2. 解决上述问题的深拷贝

javascript">/*  
	checkType 函数
	获取对象的类型返回 '[objec xxx]' 字符串
	形式字符串需要截取来获取具体类型,或添加对应判断
	这里使用截取的方式获取对应类型, 从第8位开始到,倒数第一位
*/ 

function checkType (any) {
	return Object.prototype.toString.call(any).slice(8, -1)
}

function deepClone (obj) {
	let type = checkType(obj)
	let newObj
	if (type === 'Object') {
		newObj = {}
		for(let i in obj) {
			newObj[i] = deepClone(obj[i])
		}
	} else if (type === 'Array') {
		newObj = []
		for(let i = 0; i < obj.length; i++) {
			newObj[i] = deepClone(obj[i])
		}
	} else if (type === 'Function') {
		newObj = new Function(`return ${obj.toString()}`).call(this)
	} else if (type === 'Date') {
		newObj = new Date(obj.getTime())
	} else if (type === 'RegExp') {
		newObj = new RegExp(obj)
	} else if (type === 'Map') {
		newObj = new Map()
		obj.forEach((val, key) => {
			newObj.set(key, deepClone(val))
		})
	} else if (type === 'Set') {
		newObj = new Set()
		for(let val of obj.values()) {
	      newObj.add(deepClone(val))
	    }
	} else {
		newObj = obj
	}
	return newObj
}

http://www.niftyadmin.cn/n/1483368.html

相关文章

C++数据结构——迷宫问题之几种走法

迷宫问题之几种走法 小明某天不小心进入了一个迷宫&#xff08;如上图所示&#xff09;。请帮他判断能否出走出迷宫&#xff0c;如果可能&#xff0c;则输出一共有多少种不同的走法&#xff08;对于某种特定的走法&#xff0c;必须保证不能多次走到同一个位置&#xff09;。如果…

Win7关闭HTTP 80端口

目录 问题说明关闭步骤注意事项问题说明 环境是Windows平台&#xff0c;下面介绍只是一次性关闭&#xff0c;关闭某端口的原理&#xff0c;其实就是关闭某个应用程序&#xff0c;或者修改该应用程序所设置的端口&#xff0c;而重启系统之后某程序可能会重新启动&#xff0c;导致…

钱到用时方恨少(随记)

最近有一次投资的机会只可惜平时钱大手大脚花得太厉害了,要用钱的时候却发现没有了 求爷爷靠奶奶到处借钱 哎 难怪祖宗们都说 勤俭节约,是个好习惯来自为知笔记(Wiz)转载于:https://www.cnblogs.com/qinsuixin/p/19ac0990a52cd61edd1b038d275a625f.html

spread 超链接跳转sheet 不触发 GC.Spread.Sheets.Events.ActiveSheetChanged 事件处理

快速跳转1. 发现问题2. 解决思路3. 代码实现1. 发现问题 说明: 1. 在项目中发现使用模板自带的目录超链接跳转sheet 不触发提前设置好的监听, 无法执行后续功能, 影响正常使用 2. 通过电话咨询葡萄城开发人员, 答复: 暂时没有超链接跳转sheet 监听功能 3. 通过查找资料和论坛说…

C++数据结构——迷宫问题之最短时间

迷宫问题之最短时间 小明某天不小心进入了一个迷宫&#xff08;如上图所示&#xff09;&#xff0c;请帮他计算走出迷宫的最少的时间。规定每走一格需要1个单位时间。如果不能走到出口&#xff0c;则输出impossible。每次能走的仅有上、下、左、右4个方向。 输入格式: 测试数据…

主浏览器从计算机 X上收到 一个服务器宣告,认为它是传输 XXX 上的域主浏览器。...

主浏览器从计算机 X上收到 一个服务器宣告&#xff0c;认为它是传输 XXX 上的域主浏览器。 主浏览器已停止或一个主浏览器选举已开始。注册表hkey_local_machine\system\currentcontrolset\services browser\parameters\maintainserverlist这个就是浏览器列示&#xff0c;键值是…

【算法】归并排序与快排

归并排序 归并排序是另一种不同的排序方法&#xff0c;因为归并排序使用了递归分治的思想&#xff0c;所以理解起来比较容易。其基本思想是&#xff0c;先递归划分子问题&#xff0c;然后合并结果。把待排序列看成由两个有序的子序列&#xff0c;然后合并两个子序列&#xff0c…

树形数据递归过滤

这里写目录标题树形数据过滤寻找解决办法代码实现树形数据过滤 说明: 遇到问题树形数据过滤, 并保留原有树形结构不变, 即如果有子集被选中,父级同样保留 寻找解决办法 思路: 1. 对数据进行处理, 根据过滤标识对匹配的数据添加标识 例如: visible: true2. 对有标识的子集的父…