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ㄒ)/~~

 

posted @ 2023-05-19 21:10  万物有序  阅读(164)  评论(0编辑  收藏  举报