Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript localstorage密钥本身占用多少空间?_Javascript_Html_Local Storage - Fatal编程技术网

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

Javascript localstorage密钥本身占用多少空间?,javascript,html,local-storage,Javascript,Html,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 st

假设我创建了一个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","");

您可以通过使用JSON
stringify
方法将localStorage对象转换为JSON对象来确定这一点:

JSON.stringify(localStorage).length
这不会返回密钥的实际大小,因为数据可以存储为utf16(2字节)或utf8(1字节),但它是实际大小的良好代理。请参见下面的代码片段:

 localStorage.clear()
 localStorage.setItem("keyitem","") 
 document.write(JSON.stringify(localStorage).length+'</br>')

 //Equal the space of this other one under?
 localStorage.setItem("key","item");
 document.write(JSON.stringify(localStorage).length+'</br>')

 localStorage.clear();
 localStorage.setItem("key","");
 document.write(JSON.stringify(localStorage).length+'</br>')


 //Equal the amount of storage as the 3 under combined? 
 localStorage.setItem("k","");
 localStorage.setItem("o","");
 localStorage.setItem("h","");
 document.write(JSON.stringify(localStorage).length+'</br>')
localStorage.clear()
localStorage.setItem(“keyitem”和“”)
document.write(JSON.stringify(localStorage).length+'
') //等于下面另一个的空间? setItem(“key”,“item”); document.write(JSON.stringify(localStorage).length+'
') localStorage.clear(); setItem(“key”,”); document.write(JSON.stringify(localStorage).length+'
') //存储量是否等于以下三项的总和? setItem(“k”,为“”); setItem(“o”,即“”); setItem(“h”,为“”); document.write(JSON.stringify(localStorage).length+'
')
keyitem的名称是否与 每个字符的值是多少

不,没有必要。键占用的空间量可能大于值占用的空间量。但键和值占用的空间加起来应该约为5MB(尽管这与浏览器不同,因为它依赖于浏览器)

您可以使用此代码测试:

localStorage.clear();
localStorage.setItem(new Array(5e6).join(' '),'');
localStorage.key(0).length;
上述测试的铬合金输出:


因此,只要它()您的密钥可以有任何长度

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

实际上,每个原点都有一定的空间(通常为5MiB,用于检查MDN文档中链接的实际存储空间),只要不超过该大小,就可以存储数据(键和值),如前一个答案所示。所以是的

正如我所包含的测试工具中指出的,字符实际上是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字节


有关本地存储解决方案的概述,您可以在此处查看

我曾经找到一个函数来计算
本地存储
会话存储
对象的大小,但我记不起在哪里找到它

代码如下:

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):

铬(42.0.2311.90米):

IE 11(11.0.9600.17420):

歌剧(29.0.1795.47):

因此,看起来FireFox、Chrome和Opera(可能还有Safari,但我没有)都有相同的行为,键占用的空间远远大于它们的值


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

我在Chrome中运行了一个测试,能够证明密钥占用的空间与长度完全相同


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

键的数量几乎是二进制的-
0
1
。您不能有多个同名键,对
setItem
的多次调用只需覆盖上一个值。这是特定于浏览器的,因为每个浏览器存储数据的方式都不同,例如chrome/firefox我相信使用sqlite dbs、opera xml文件请记住,这可能正是浏览器想要使用的。我猜它将存储16或32位字符串作为键和值。但我不确定。(浏览器想要做的是:它们以不同的方式实现,probs)我编辑了不同的keyitems你是说所有浏览器都将其存储为JSON字符串?我想这是有道理的,因为它是Javascript对象表示法,但你怎么知道的?我很感兴趣你的答案是什么?我不知道您在jsFiddle中确定了什么,而且jsFiddle现在没有为我加载。这就是为什么我们把所有重要的细节直接放在这里,而不是放在其他一些蹩脚的网站上。很抱歉,这个代码片段在StackOverflow本身上不起作用。这并没有显示实际密钥占用了多少空间。这只是显示了localStorage的JSON表示形式所包含的字符数。每个浏览器都实现自己的数据保存方式。这些方法中的每一种存储数据的方式都可能与另一种完全不同。例如,一个可能使用utf8编码,而另一个可能使用utf16(意味着使用2个字节来表示1个字符),一些可能使用压缩等。我同意,但这是理解localStorage中存储内容的最佳代理。此外,在Chrome上,5MB相当于250万个字符。还有:@Rahil Tripathi在这种情况下会说5MB也等于250万本地存储;哪个也只包含一个字符?@mattias:-不,这是上限(这也是特定于浏览器的)。您可以运行我在您的浏览器中添加的测试(firefox为我提供了大约2.94MB),您将获得密钥占用的空间。如果您将密钥用作“k”,则它不是5MB。这有意义吗?@mattias:-如果你想检查一下