gaialun

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

利用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]){
           // ....
     
    }
})        

  如果发现有错误或者不足的地方,感谢指出!

posted on 2022-05-31 00:11  能倒杯茶吗?  阅读(224)  评论(0)    收藏  举报