工作中经常会遇到对象深拷贝的问题,所以这篇文章给大家简单介绍一下对象深拷贝的方法,也可以当做是自己的笔记,以备查看。
深拷贝的方法我所了解的也是我工作中常用的有两种。
一、JSON数据转换
let obj1 = {
name: 'Tom',
bodyInfo: {
foot: 's41'
}
};
let obj2 = JSON.parse(JSON.stringify(obj1));
console.log(obj2);
/*
{
name: 'Tom',
bodyInfo: {
foot: 's41'
}
}
*/
这样一行代码就完成了JS对象的深度拷贝,但是此方法有弊端,就是如果值为undefined,function,symbol(ES6新数据类型,可自行百度,此处不做介绍)的时候,对象的属性会自动抹去。
let sy = Symbol('obj');
let obj1 = {
name: 'Tom',
wife: undefined,
bodyInfo: {
foot: 's41'
},
say: function(){},
IDcard: sy
};
let obj2 = JSON.parse(JSON.stringify(obj1));
console.log(obj2);
/*
{
name: 'Tom',
bodyInfo: {
foot: 's41'
}
}
*/
所以在使用这个方法的时候需要考虑好是否是适合的场景,否则容易出现问题。
二、封装方法
自己封装一个深拷贝方法虽然比第一种稍微复杂一点点,但是最实用。
function deepCopy(obj) {
let _obj = Array.isArray(obj) ? [] : {};
for (let i in obj) {
if (obj.hasOwnProperty(i)) {
if (typeof obj[i] === 'object') {
_obj[i] = deepCopy(obj[i]);
} else {
_obj[i] = obj[i];
}
}
}
return _obj;
}
简单的几行代码,深拷贝的函数就封装完成了。
还有部分小伙伴使用object.assign, 数组的concat() 等方法进行拷贝。这样虽然能实现深拷贝,但是局限于拷贝对象的值,如果对象内包含复杂数据类型,就会拷贝失败。如果您拷贝的对象都是基础数据类型的话可以使用。