分享下js深拷贝对象,两种最常用、最实用的方法
方法1、递归遍历对象的属性,返回一个新的对象
// 这里有两种写法,都可用
const obj1 = {
name: 'wang',
f: function() {},
tar: {
name:'Jason',
age: 18
}
}
function deepClone(obj) {
// 写法1
// let newObj = obj.constructor === Array ? [] : {}
// if(typeof obj !== 'object') {
// return obj
// }else{
// for(var i in obj) {
// if(typeof obj[i] === 'object'){
// newObj[i] = deepClone(obj[i])
// }else{
// newObj[i] = obj[i]
// }
// }
// }
// return newObj;
// 写法2
if (!obj && typeof obj !== "object") {
throw new Error("error arguments", "deepClone");
}
const targetObj = obj.constructor === Array ? [] : {};
Object.keys(obj).forEach(keys => {
if (obj[keys] && typeof obj[keys] === "object") {
targetObj[keys] = deepClone(obj[keys]);
} else {
targetObj[keys] = obj[keys];
}
});
return targetObj;
}
var obj2 = deepClone(obj1)
console.log(obj2)
方法2:通过Object.create和Object.defineProperty取对象的所有属性,返回一个新的对象
// 方法2和方法1的区别在于,使用方法1不能拷贝对象中的时间和正则
var obj = {
name: 'wang',
f: function() {},
tar: {
name:'Jason',
age: 18,
cc: {
lang: 'typescript'
}
},
arr: ['11', '22'],
reg: /\s|\n/g,
date: new Date()
}
function deepClone(orig) {
var copy = Object.create(Object.getPrototypeOf(orig))
copyOwnPropertiesFrom(copy,orig);
return copy;
}
function copyOwnPropertiesFrom(target, source) {
Object.getOwnPropertyNames(source)
.forEach(ele =>{
// 获取到每个属性的所有描述,然后重新定义对象的属性并返回此对象。
var desc = Object.getOwnPropertyDescriptor(source,ele);
Object.defineProperty(target,ele,desc)
});
return target;
}
deepClone(obj)
深拷贝的方法有很多种,这里只提供两种最常用的,主要是看哪种最适用你自己