JS中深拷贝的几种实现方法

概念

首先,我们需要简单了解什么是深拷贝,什么是浅拷贝

深拷贝:拷贝的是对象或者数组内部数据的实体,重新开辟了内存空间存储数据;
浅拷贝:拷贝的是引用类型的指针,副本和原数组或对象指向同一个内存;

1.通过JSON对象

这个方法可以简单粗暴的实现深拷贝,但是还存在问题,拷贝的对象中如果有函数,undefined,symbol,当使用过JSON.stringify()进行处理之后,都会消失。

//通过js的内置对象JSON来进行数组对象的深拷贝
function deepClone(obj) {
    let objClone = JSON.parse(JSON.stringify(obj));
  return objClone;
}

2、递归实现

这个方法其实也是有缺陷的,没法拷贝一些特殊对象(如 new Map() 

function deepClone(obj) {
	// 数据类型为引用数据类型
	if (typeof obj === 'object') {
		// 初始化返回结果
		let result = Array.isArray(obj)? []: {};
		for (let key in obj) {
			// 避免相互引用出现死循环导致爆栈
			if (obj === obj[key]) {
				continue
			}
			if (obj.hasOwnProperty(key)) {
				// 递归调用
				result[key] = deepClone(obj[key])
			}
		}
		return result;
	} else {
		// 基本数据类型,直接返回
		return obj
	}
}

3.jQuery的extend方法实现深拷贝

var array = [1,2,3,4];
var newArray = $.extend(true,[],array); // true为深拷贝,false为浅拷贝

4.函数库lodash的_.cloneDeep方法

var _ = require('lodash')

var obj = {
  a: {
    c: 2,
    d: [9, 8, 7]
  },
  b: 4
}

var obj1 = _.cloneDeep(obj)

console.log(obj === obj1);//false

5.其他

  • Object.assign(obj1, obj2)
  • 扩展运算符...
  • concat、slice

注意:只有一级属性为深拷贝,二级属性后就是浅拷贝

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值