JS通过原型实现数据深度拷贝,兼容所有类型值

本文介绍了一种在JavaScript中实现深拷贝的有效方法。该方法通过在对象原型上增加clone方法来完成,能妥善处理各种数据类型,包括对象、数组、函数等,并能正确复制null和undefined值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

网上有很多深度克隆的例子方法,很多都不是很完美,要嘛遇到null或者undefined会报错,要嘛数组类型有问题,或者函数丢失,更多的是直接定义一个方法去调用,没有直接通过原型实现调用起来来得方便,随手写个记录下

实现代码

       //原型上增加深度克隆方法
		Object.prototype.clone = function() {
			 function isNullOrUndefined(val){
				 return val === null || val === undefined
			 }
			if (Array.isArray(this)) { //数组类型
				return this.map(item => {
					return isNullOrUndefined(item) ? item : item.clone()//null和undefined无原型直接返回
				})

			} else if (Object.prototype.toString.call(this) === '[object Object]') {//对象类型
				let obj = {}
				for (let key in this) {
					if (this.hasOwnProperty(key)) {
						obj[key] =isNullOrUndefined(this[key])  ? this[key] : this[key].clone()
					}
				}
				return obj

			}
			return this.valueOf()//其他类型(基本类型或函数)
		}

调用 object.clone()

	   let obj={
			a:[1,2,null],
			b:undefined,
			c:{
				m:1
			},
			d:function(){}
		}
		let deepCloneObj= obj.clone()
		deepCloneObj.a[1]='test'
		deepCloneObj.c.m='test'
		console.log(deepCloneObj,'deepCloneObj')
		console.log(obj.clone(), 'deepClone')

打印结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pixle0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值