我的代码:视线sizeof函数计算传入参数占用多少字节

142 阅读1分钟

const hasAddr = new WeakSet();//引用类型可能会引用同一个地址,使用WaekSet因为他是弱引用,当没有没有引用的时候会被js回收
const calcArg = obj => {
    const typeArg = typeof obj;
    switch (typeArg) {
        case 'string':
            return 2 * obj.length;
        case 'number':
            return 8;
        case 'boolean':
            return 4;
        case 'object':
            if (Array.isArray(obj)) { //低版本校验:Object.prototype.toString.call(val) === "[object Array]"
                return obj.map(calcArg).reduce((size, v) => size + v, 0)
            } else {
                //对象类型
                if (obj === null) return 0
                let byte = 0;//内存计数
                let keys = Object.keys(obj); //键值存储也需要计算
                for (let key = 0; key < keys.length; key++) {
                    if (obj[key] === null) continue
                    if (typeof obj[key] === 'object') {
                        if (hasAddr.has(obj[key])) continue
                        hasAddr.add(obj[key]);
                    }
                    byte += calcArg(obj[keys[key]]);
                    byte += calcArg(keys[key])
                }
                return byte
            }
    }
}

console.log(calcArg({
    a:111,
    b:'cccc',
    2222:false,
}))