三种常用深拷贝及其特点

本文详细介绍了JavaScript中实现对象深拷贝的三种常见方法:通过JSON.parse(JSON.stringify())、Object.assign()以及递归复制。分别阐述了它们的使用场景、优点和缺点,包括性能、数据类型的处理等问题,并强调了完全深拷贝的重要性。

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

1、JSON与字符串的互转(俗称丐版)


newObj = JSON.parse(JSON.stringify(oldObj)

优点:

  • 简单,方便;
  • 应付比较正常的数据。

缺点:

  • 性能问题,stringify再解析其实需要耗费较多时间,特别是数据量大的时候;
  • 一些类型无法拷贝,例如函数(不输出),正则(输出空对象),时间对象(输出时间字符串),Undefiend(不输出)等等问题。

2、Object.assign


var obj = {};
var o1 = { a: 1 };
var o2 = { b: 2 };

var obj = Object.assign(obj, o1, o2);
console.log(obj); // { a: 1, b: 2 }

优点:

  • 简单方便;
  • 应付非引用类型的数据。

缺点:

  • 对于一层对象来说是没有任何问题的,但是如果对象的属性对应的是其它的引用类型的话,还是只拷贝了引用,修改的话还是会有问题

3、递归深拷贝


function deepCopy(newObj, oldObj) {
	newObj = newObj || {};
	for (var i in oldObj) {
		if (oldObj.hasOwnProperty(i)) {
            // 判断是复杂数据类型还是简单数据类型
			if (typeof oldObj[i] === 'object') {
                // 判断是数组还是对象
				newObj[i] = Array.isArray(oldObj[i]) ? [] : {};
                // 递归调用
				deepCopy(newObj[i], oldObj[i]);
			} else {
                // 属于简单数据类型 直接赋值
				newObj[i] = oldObj[i];
			}
		}
	}
	return newObj;
}

优点:

  • 完全深克隆,无论是复杂数据类型还是简单数据类型。

缺点:

  • 需要自定义deepClone函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值