localStorage值的最大值是多less?

由于localStorage (当前)只支持string作为值,为了做到这一点,对象需要在被存储之前被string化(存储为JSONstring),是否存在对值长度的限定。

有谁知道是否有一个适用于所有浏览器的定义?

从维基百科的文章引用Web存储 :

Web存储可以被简单地看作是对cookies的改进,提供了更大的存储容量( 谷歌浏览器( https://plus.google.com/u/0/+FrancoisBeaufort/posts/S5Q9HqDB8bh),Mozilla Firefox ,Opera; Internet Explorer中每个存储区10 MB )以及更好的编程接口。

还引用了John Resig的文章 [2007年1月发表]:

储存空间

这意味着,与DOM存储相比,您有比存储在Cookies上的典型用户代理限制更多的存储空间。 但是,提供的数量在规范中没有定义,也没有由用户代理进行有意义的广播。

如果您查看Mozilla源代码,我们可以看到5120KB是整个域的默认存储大小。 与典型的2KB cookie相比,这样可以为您提供更多的空间。

但是,这个存储区域的大小可以由用户来定制 (所以不能保证5MB的存储空间,也不是暗示的),而用户代理(例如Opera只能提供3MB的存储空间 – 但是只有时间才能说明问题。 )

其实歌剧没有5MB的限制。 它提供了增加限制,因为应用程序需要更多。 用户甚至可以为域select“无限存储”。

您可以轻松地自行testinglocalStorage限制/配额 。

以下是找出限制的简单脚本:

 if (localStorage && !localStorage.getItem('size')) { var i = 0; try { // Test up to 10 MB for (i = 250; i <= 10000; i += 250) { localStorage.setItem('test', new Array((i * 1024) + 1).join('a')); } } catch (e) { localStorage.removeItem('test'); localStorage.setItem('size', i - 250); } } 

这是JSFiddle和博客文章 的要点 。

该脚本将testing设置越来越大的文本string,直到浏览器抛出exception。 在这一点上,它将清除testing数据,并在localStorage中设置一个大小关键字(以千字节为单位)。

不要假设5MB可用 – 本地存储容量因浏览器而异,2.5MB,5MB和无限是最常见的值。 资料来源: http : //dev-test.nemikor.com/web-storage/support-test/

查找可存储在localStorage中的单个string的最大长度

这段代码将查找可存储在每个域的localStorage中的string的最大长度。

 //Clear localStorage for (var item in localStorage) delete localStorage[item]; window.result = window.result || document.getElementById('result'); result.textContent = 'Test running…'; //Start test //Defer running so DOM can be updated with "test running" message setTimeout(function () { //Variables var low = 0, high = 2e9, half; //Two billion may be a little low as a starting point, so increase if necessary while (canStore(high)) high *= 2; //Keep refining until low and high are equal while (low !== high) { half = Math.floor((high - low) / 2 + low); //Check if we can't scale down any further if (low === half || high === half) { console.info(low, high, half); //Set low to the maximum possible amount that can be stored low = canStore(high) ? high : low; high = low; break; } //Check if the maximum storage is no higher than half if (storageMaxBetween(low, half)) { high = half; //The only other possibility is that it's higher than half but not higher than "high" } else { low = half + 1; } } //Show the result we found! result.innerHTML = 'The maximum length of a string that can be stored in localStorage is <strong>' + low + '</strong> characters.'; //Functions function canStore(strLen) { try { delete localStorage.foo; localStorage.foo = Array(strLen + 1).join('A'); return true; } catch (ex) { return false; } } function storageMaxBetween(low, high) { return canStore(low) && !canStore(high); } }, 0); 
 <h1>LocalStorage single value max length test</h1> <div id='result'>Please enable JavaScript</div> 

请注意,JavaScript中string的长度是有限的。 如果您想要查看localStorage可以存储的最大数据量(不限于单个string),则可以使用此答案中的代码 。

编辑: Stack Snippets不支持localStorage ,所以这里是JSFiddle的链接 。

结果

Chrome(45.0.2454.101): 5242878个字符
Firefox(40.0.1): 5242883个字符
Internet Explorer(11.0.9600.18036) 16386 122066 122070个字符

在Internet Explorer中,每次运行都会得到不同的结果。

您不想将大对象串入一个localStorage条目中。 这将是非常低效的 – 整个事情将不得不被parsing和重新编码每次细微的细节变化。 而且,JSON不能处理对象结构中的多个交叉引用,并且抹去了很多细节,例如构造函数,数组的非数值属性,稀疏条目中的内容等等。

相反,你可以使用http://rhaboo.org 。 它使用大量localStorage条目来存储大型对象,以便您可以快速进行小的更改。 恢复的对象是保存的更精确的副本,API非常简单。 例如:

 var store = Rhaboo.persistent('Some name'); store.write('count', store.count ? store.count+1 : 1); store.write('somethingfancy', { one: ['man', 'went'], 2: 'mow', went: [ 2, { mow: ['a', 'meadow' ] }, {} ] }); store.somethingfancy.went[1].mow.write(1, 'lawn'); 

顺便说一句,我写了。

移动浏览器:

 Browser | Chrome | Android Browser | Firefox | iOS Safari Version | 40 | 4.3 | 34 | 6-8 Available | 10MB | 2MB | 10MB | 5MB 

桌面浏览器:

 Browser | Chrome | Opera | Firefox | Safari | IE Version | 40 | 27 | 34 | 6-8 | 9-11 Available | 10MB | 10MB | 10MB | 5MB | 10MB 

我正在做以下事情:

 getLocalStorageSizeLimit = function () { var maxLength = Math.pow(2,24); var preLength = 0; var hugeString = "0"; var testString; var keyName = "testingLengthKey"; //2^24 = 16777216 should be enough to all browsers testString = (new Array(Math.pow(2, 24))).join("X"); while (maxLength !== preLength) { try { localStorage.setItem(keyName, testString); preLength = testString.length; maxLength = Math.ceil(preLength + ((hugeString.length - preLength) / 2)); testString = hugeString.substr(0, maxLength); } catch (e) { hugeString = testString; maxLength = Math.floor(testString.length - (testString.length - preLength) / 2); testString = hugeString.substr(0, maxLength); } } localStorage.removeItem(keyName); maxLength = JSON.stringify(this.storageObject).length + maxLength + keyName.length - 2; return maxLength; }; 

我真的很喜欢cdmckay的回答 ,但是实时检查大小并不是很好:它太慢了(对我来说是2秒)。 这是改进后的版本,速度更快,更精确,还可以select多大的误差(默认值是250,000 ,误差越小,计算时间越长):

 function getLocalStorageMaxSize(error) { if (localStorage) { var max = 10 * 1024 * 1024, i = 64, string1024 = '', string = '', // generate a random key testKey = 'size-test-' + Math.random().toString(), minimalFound = 0, error = error || 25e4; // fill a string with 1024 symbols / bytes while (i--) string1024 += 1e16; i = max / 1024; // fill a string with 'max' amount of symbols / bytes while (i--) string += string1024; i = max; // binary search implementation while (i > 1) { try { localStorage.setItem(testKey, string.substr(0, i)); localStorage.removeItem(testKey); if (minimalFound < i - error) { minimalFound = i; i = i * 1.5; } else break; } catch (e) { localStorage.removeItem(testKey); i = minimalFound + (i - minimalFound) / 2; } } return minimalFound; } } 

去testing:

 console.log(getLocalStorageMaxSize()); // takes .3s console.log(getLocalStorageMaxSize(.1)); // takes 2s, but way more exact 

这对标准错误的工作速度要快得多。 在必要的时候也可以更精确。