// 深拷贝
let deepCopy = (obj, result)=>{
// 如果result存在则直接使用否则判断其类型如果是对象就设置为空对象反之为空数组
result = result ? result : Object.prototype.toString.call(obj) === "[object Object]" ? {} : [];
for(let key in obj) {
if(obj.hasOwnProperty(key)) {
// 如果判断结果是Object
if(typeof obj[key] === 'Object') {
// 完全判断 如果为当前属性为对象的话
if(Object.prototype.toString.call(obj[key]) === "[object Object]" && Object.prototype.toString.call(obj[key]) !== null) {
result[key] = {};
}else {
result[key] = [];
}
// 深度递归当前属性
deepCopy(obj[key], result[key]);
}
// 否则是非对象或数组的属性可以直接赋值
else{
result[key] = obj[key];
}
}
}
return result;
}
为了以防小伙伴们还要查找这些方法都是怎么使用的,我这里就为大家简述一下
Object.prototype.toString.call(): 用来精确判断对象类型
hasOwnProperty(): 当前使用该方法的对象是否有这个属性
思路: 利用循环加递归的方式进行深拷贝,一层层查找直到全部为非对象或数组类型时就赋值,便可毫无遗漏的拷贝每一个属性。