js storage 存储大小测试

问题由来:网上说 localStorage 和 sessionStorage 的存储大小是 5M,那么这是一个精确数字还是一个估算数字?

测试下:

 1 function getSize(storage) {
 2   const _storage = window[storage];
 3   let pieces = [20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0].map(
 4       (bits) => 2 ** bits
 5     ),
 6     size = 0;
 7   function trySize() {
 8     if (pieces.length) {
 9       const piece = pieces.shift();
10       try {
11         while (true) {
12           size += piece;
13           _storage.setItem(`${storage}:test`, "1".repeat(size));
14         }
15       } catch (err) {
16         size -= piece;
17         trySize();
18       }
19     }
20   }
21 
22   _storage.clear();
23 
24   trySize();
25 
26   _storage.clear();
27 
28   return size;
29 }
30 
31 console.log(getSize("localStorage")); // 5242863
32 console.log(getSize("sessionStorage")); // 5242861

分析:这个结果一看就知道不是 5 * 2 ** 20,肯定不是 5M,直接在浏览器 F12 测试下这个结果,

可以看到,增加一个字节也能存储,为什么会这样呢,我看了好几次代码都没找到问题所在。

然后我就继续在 F12 里测试了很多遍,终于发现问题了,

从上面几条测试记录来看,'aaa' 的存储大小为 5242877,'aaaa' 的存储大小为 5242876,刚好差一个字节,而 'aaa' 和 'aaaa' 也刚好差一个字节,

这是不是说 localStorage 的存储大小是指 key 和 value,而不是单独的 value,

然后我们把 key 和 value 的字节数相加,

终于发现了,key 和 value 是作为一个整体存储的,这个数字刚好是 5 * 2 ** 20,

结果:由此可见,localStorage 的存储大小是刚好 5M,

继续测试下 sessionStorage 也是这样的,

上面代码的 return 需要改下,

return size + `${storage}:test`.length;

再次调用这个方法,

 终于对上了,/(ㄒoㄒ)/~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值