localstorage密钥本身占用多少空间?

时间:2015-04-29 13:16:35

标签: javascript html5 local-storage

让我说我创建一个localstorage键并给它一个空字符串。 keyitem的名称是否占用与每个字符的值相同的空间量?

例如

localStorage.setItem("keyitem","") 
//Equal the space of this other one under?
localStorage.setItem("key","item");

此外,键的数量是否重要?例如

localStorage.setItem("key","");
//Equal the amount of storage as the 3 under combined? 
localStorage.setItem("k","");
localStorage.setItem("o","");
localStorage.setItem("h","");

4 个答案:

答案 0 :(得分:2)

我找到了一个函数来计算localStoragesessionStorage对象的大小,但我无法记住我找到它的位置。

以下是代码:

Storage.prototype.size = function(units) {
    'use strict';
    units = units ? units.toUpperCase() : 'MB';
    var size = unescape(encodeURIComponent(JSON.stringify(this))).length;
    switch (units) {
        case 'B': return [size,'B'].join(' ');
        case 'KB': return [+(size / 1024).toFixed(3),'KB'].join(' ');
        default: return [+(size / 1024 / 1024).toFixed(3),'MB'].join(' ');
    }
};

我决定继续在各种浏览器中运行一些测试。

  

Firefox(37.0.2):

     

Firefox console output

  

Chrome(42.0.2311.90米):

     

Chrome console output

  

IE 11(11.0.9600.17420):

     

IE Console Output

  

Opera(29.0.1795.47):

     

Opera console output

所以它看起来像FireFox,Chrome和Opera(可能也是Safari,但我没有)都具有相同的行为,并且键占用的空间远远超过它们的值。

在IE(旧的IE ......)中,执行的执行方式与存储内容的方式无关。

答案 1 :(得分:1)

  

keyitem的名称是否占用了相同的空间   每个字符值?

不,没有必要。密钥占用的空间量可能大于值占用的空间量。但是密钥和值占用的空间应该大约为5MB(虽然这与浏览器不同,因为它依赖于浏览器

您可以使用此代码进行测试:

localStorage.clear();
localStorage.setItem(new Array(5e6).join(' '),'');
localStorage.key(0).length;

Chrome上的输出以进行上述测试:

enter image description here

只要comes under 5MBwhich is mostly the upper limit for most browsers)你的密钥可以有任何长度

答案 2 :(得分:0)

我想说这是关于磁盘上存储的真实结构的实现细节。

实际上,每个来源都有一定的空间(通常为5MiB,用于检查实际存储空间,您可以使用MDN文档中链接的test tool)并且可以存储数据(两者都是按键)和值)只要你没有超过那个大小,如前一个答案所示。所以是keys are included in the storage quota

正如我在测试工具中指出的那样,字符实际上是UTF-16,所以它们占用了2个字节的存储空间。

另请注意,存储存储字符串,这意味着如果您将大浮点数作为键或值放置,则不会将其存储为二进制格式,而是存储为字符串!

// These takes up the same space
localStorage.setItem("a", 123);
localStorage.setItem("a", "123");

事实上,如果您尝试执行以下类型的操作,则在两种情况下都会获得string

localStorage.setItem("123", "");
localStorage.setItem(123, "");
typeof localStorage.key(0); // returns "string"
typeof localStorage.key(1); // returns "string" as well

关于第二部分,就存储而言

localStorage.setItem("k","");
localStorage.setItem("o","");
localStorage.setItem("h","");

应该从配额中获取3个字符的存储空间,如果使用UTF-16则为3 * 2字节,如果使用UTF-8则为3字节。

有关本地存储解决方案的概述,请访问http://www.html5rocks.com/en/features/storage

答案 3 :(得分:0)

我在Chrome中进行了测试,并且能够证明该密钥占用的空间与长度完全相同。

使用abc键,我可以设置长度为5242877的值。使用a键,我可以设置长度为5242879的值。如您所见,从键中删除字符可以释放那些值为2的字符。