JS 实现 sizeOf 函数,计算 object 占用了多少个 bytes

可以参考:https://github.com/miktam/sizeof

字节大小取自 ECMAScript 语言规范

  • Number:8 个字节(64 位存储)
  • String:一个字符 2 字节
  • Boolean:4 个字节
const same = {}
const testData = {
  a: 111,
  b: 'ccc',
  222: false,
  c: same,
  d: same,
}

const seen = new WeakSet()
function sizeOfObj(obj) {
  if (obj === null) return 0

  let bytes = 0
  // 对象里的key也是占用内存空间的
  const props = Object.keys(obj)
  for (let i = 0; i < props.length; i++) {
    const key = props[i]
    // 无论value是否重复,都需要计算key
    bytes += calculator(key)
    if (typeof obj[key] === 'object' && obj[key] !== null) {
      // 这里需要注意value使用相同内存空间(只需计算一次内存)
      if (seen.has(obj[key])) continue
      seen.add(obj[key])
    }
    bytes += calculator(obj[key])
  }
  return bytes
}

function calculator(obj) {
  const objType = typeof obj
  switch (objType) {
    case 'string':
      return obj.length * 2
    case 'boolean':
      return 4
    case 'number':
      return 8
    case 'object':
      if (Array.isArray(obj)) {
        // 数组处理 [1,2] [{x:1},{y:2}]
        return obj.map(calculator).reduce((res, cur) => res + cur, 0)
      } else {
        // 对象处理
        return sizeOfObj(obj)
      }
    default:
      return 0
  }
}
console.log(calculator(testData)) // 32
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值