利用for...in...来遍历对象的属性,如果对象属性是数组或者对象的话,则进行递归。
function copyObject(targetObj, resultObj = {}) {
for (let key in targetObj) {
switch (Object.prototype.toString.call(targetObj[key])) {
case '[object Array]':
resultObj[key] = [];
copyObject(targetObj[key], resultObj[key]);
break;
case '[object Object]':
resultObj[key] = {};
copyObject(targetObj[key], resultObj[key]);
break;
default:
resultObj[key] = targetObj[key];
break;
}
}
return resultObj;
}
这个方法可以拷贝对象中的可枚举属性和继承的属性(for...in...可以遍历继承的属性),但不能拷贝原对象中的Symbol属性。如果想要拷贝Symbol属性,可以使用Object.getOwnPropertySymbol()方法,该方法会返回一个对象中的Symbol属性的数组,然后就可以通过遍历继续判断属性值是什么类型,再进行不同方式的拷贝。
const a = Symbol()
let obj = {
[a]: 1
}
Object.getOwnPropertySymbols(obj).forEach(key => {
switch(obj[key]){
// ....
}
})
如果发现有错误或者不足的地方,感谢指出!
浙公网安备 33010602011771号