localStorage 值的最大大小是多少?

IT技术 javascript html local-storage
2021-02-08 02:38:54

由于localStorage(当前)仅支持字符串作为值,并且为了做到这一点,对象需要在存储之前进行字符串化(存储为 JSON 字符串),因此是否存在关于值长度的定义限制。

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

6个回答

引自维基百科关于 Web Storage 的文章

Web 存储可以简单地视为对 cookie 的改进,提供更大的存储容量(Google Chrome 中每个来源 10 MB(https://plus.google.com/u/0/+FrancoisBeaufort/posts/S5Q9HqDB8bh),Mozilla Firefox和 Opera;Internet Explorer 中每个存储区域 10 MB)和更好的编程接口。

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

储存空间

这意味着,使用 DOM 存储,您拥有比对 Cookie 强加的典型用户代理限制更多的存储空间。然而,提供的数量没有在规范中定义,也没有被用户代理有意义地广播。

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

但是,该存储区域的大小可以由用户(因此不能保证或暗示 5MB 存储区域)和用户代理(例如,Opera 可能只提供 3MB - 但只有时间会证明)。 )

@Cupidvogel:不,它不是按域,而是按来源,因为该术语是针对同源策略使用的,例如:scheme+host+port。http://example.com并且https://example.com不是同一来源(不同的方案)。http://example.com并且http://www.example.com不是同一来源(不同的主机)。http://example.com并且http://example.com:8080不是同一来源(不同的端口)。哈。:-)
2021-03-18 02:38:54
但是,对单个有限制吗?(如果我有很多标志要存储,将它作为 JSON 存储在单个属性中有多安全?)
2021-03-20 02:38:54
不,我只是想确保可以跨同一域的多个页面访问相同的数据。我经常发现短语 domain 和 page 拼写成同义词,所以只是想确定!
2021-03-26 02:38:54
@Cupidvogel 不,这意味着每个domain( origin) 可以在任何单个客户端上存储 5MB。数据存储在客户端机器上 - 该localStorage机制绝不会跨客户端交互。
2021-03-29 02:38:54
我有 5MB 的 Safari 和 10MB 的 Chrome 39(不确定何时从 5MB 提升)请参阅这篇文章html5rocks.com/en/tutorials/offline/quota-research
2021-04-02 02:38:54

实际上 Opera 没有 5MB 的限制。当应用程序需要更多时,它提供增加限制。用户甚至可以为域选择“无限存储”。

您可以自己轻松测试 localStorage 限制/配额

@FelixAlcala——实际上,JavaScript 公开了UCS-2. 虽然它与此相似,UFT16但存在一些非常重要的差异……主要围绕 UCS-2 早于 UFT 的事实展开。
2021-03-12 02:38:54
我最近在 Chrome 80 上运行了这个测试,得到了 520 万个字符,但仍然允许 5MB
2021-03-17 02:38:54
@FelixAlcala 不幸的是,它使 Mac OS X 上的 Chrome 15.0.874.54 beta 崩溃了。我在 1.500.000 个字符处崩溃了。
2021-03-20 02:38:54
不再使 Chrome 崩溃...有趣的一点:Chrome 上的 5MB 等于 250 万个字符。显然,UFT16 用于 localStore。
2021-04-03 02:38:54
它使我的设备上的 chrome 崩溃,也重置了背景,不过并不奇怪,我的手机内存这么小,它无法处理在 chrome 打开时打开一个愚蠢的 FLASHLIGHT 应用程序。
2021-04-03 02:38:54

这是一个用于找出限制的简单脚本:

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博客文章

该脚本将测试设置越来越大的文本字符串,直到浏览器抛出异常。届时它将清除测试数据并在 localStorage 中设置一个大小键,以千字节为单位存储大小。

Ooook,肯定开枪。我在您的代码中遇到的问题是无法使用正确的方法将字节大小转换为 Javascript 中的 KB、MB、GB 的正确方法...我明天会修改这个,但如果你能看一下,赞赏。
2021-03-10 02:38:54
很酷的解决方案。我找到了这个班轮,你觉得如何?
2021-03-12 02:38:54
@brasofolo 我认为一个班轮假设你有 5MB,然后减去正在使用的数量。
2021-03-19 02:38:54
此处提高了此答案的性能和质量
2021-03-28 02:38:54
现在是 2020 年,这个答案在 Win10 上的 vanilla Chrome 和 Firefox 上都可以正常工作,大小为 5000。
2021-03-28 02:38:54

找出可以存储的单个字符串的最大长度 localStorage

此代码段将查找localStorage每个域中可以存储的字符串的最大长度

//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 中是有限制的;如果您想查看在localStorage不限于单个字符串的情况下可以存储的最大数据量,您可以使用此答案中的代码

编辑: 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 中运行时,我都会得到不同的结果。

有趣,但是当我在运行约 1 分钟后在 Edge 浏览器(在 Win 10 上)中进行测试时,您的简单测试会停止我非常强大的系统。所以我不能在你的结果中附加新数据))
2021-03-26 02:38:54

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