js实现深拷贝的几种方式

1、通过递归方式实现[深拷贝],比较全面的深拷贝,缺点是较为繁琐

vbnet 复制代码
function deepClone(obj) {
	var target = {};
	for (var key in obj) {
		if (Object.prototype.hasOwnProperty.call(obj, key)) {
			if (typeof obj[key] === 'object') {
				target[key] = deepClone(obj[key]);
			} else {
				target[key] = obj[key];
			}
		}
	}
	return target;
}

2、JSON.parse(JSON.stringify(obj)) 满足一般使用场景,缺点是无法实现对象中方法(function)的深拷贝

javascript 复制代码
let obj = {
	id: 1,
	name: '张三',
	age: 10,
}
let newObj = JSON.parse(JSON.stringify(obj))

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

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

4、Object.assign(obj1, obj2)实现深拷贝,只有一级属性为深拷贝,二级属性后就是[浅拷贝]

bash 复制代码
let obj = {
	id: 1,
	name: '张三',
	age: 10,
}
let newObj = Object.assign({}, obj)

5、[扩展运算符]实现深拷贝,只有一级属性为深拷贝,二级属性后就是浅拷贝

css 复制代码
var obj = {
    a: 1,
    b: 2
}
 
var obj1 = {...obj}

6、数组使用数组方法进行深拷贝(concat、slice)只有一级属性为深拷贝,二级属性后就是浅拷贝,如[1,2,3,[1,2,3]]

ini 复制代码
var arr1 = [1, 2, 3, 4]
var arr2 = arr1.concat()
var arr3 = arr1.slice(1)

7、使用Vue提供的观察者模式实现数组深度复制,需要复制的数组

ini 复制代码
let arr1 = [{name: "小明", age: 18}, {name: "小芳", age: 20}];
let arr2 = Vue.util.extend([], arr1);

8、使用ES6提供的扩展运算符实现数组深度复制

ini 复制代码
//需要复制的数组
let arr1 = [{name: "小明", age: 18}, {name: "小芳", age: 20}];
//使用ES6的扩展运算符实现数组深度复制
let arr2 = [...arr1];
相关推荐
紫_龙12 分钟前
最新版vue3+TypeScript开发入门到实战教程之vue3与vue2语法优劣对比
前端·javascript·typescript
全栈小51 小时前
【前端】Vue 组件开发中的枚举值验证:从一个Type属性错误说起
前端·javascript·vue.js
Joker Zxc1 小时前
【前端基础(Javascript部分)】4、JavaScript的分支语句
开发语言·前端·javascript
꧁꫞꯭零꯭点꯭꫞꧂1 小时前
G6绘制机柜 以及机柜设备的demo
前端·javascript·vue.js
Lee川2 小时前
🚀 JavaScript 内存大揭秘:从“栈堆搬家”到“闭包时空胶囊”
前端·javascript·面试
唐叔在学习2 小时前
TodoList应用:SPA应用首屏性能优化实践
前端·javascript·性能优化
kyriewen2 小时前
别再滥用 iframe 了!这些场景下它其实是最优解
前端·javascript·html
恪愚2 小时前
three | 材质 Material
前端·javascript·材质
昨日余光3 小时前
建议收藏!我开发了一个免费无限制的AI绘画公益站!
开发语言·前端·javascript·ai作画·typescript
optimistic_chen3 小时前
【Vue入门】创建Vue工程环境和响应式函数
前端·javascript·vue.js·前端框架·html