localstorage和sessionstorage如果存满会怎样?

关于浏览器的存储知识详细见我写的文章https://blog.youkuaiyun.com/fageaaa/article/details/145643306

1.示例

如果localstorage和sessionstorage存储容量溢出了怎么办?我们可以使用一个测试网站来看看:

<!DOCTYPE html>
<html lang="zh-cn">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Storage Limit Test</title>
</head>
<body>
    <script>
        function testStorageLimit(storageType) {
            try {
                const storage = window[storageType];
                const maxStorageSize = 5 * 1024 * 1024; // 5MB
                const testData = 'a'.repeat(maxStorageSize); // 创建一个大小为5MB的测试数据

                storage.setItem('testData', testData);
                console.log(`${storageType} - Data stored successfully.`);

                // 尝试读取存储的数据
                const retrievedData = storage.getItem('testData');
                console.log(`${storageType} - Retrieved data length:`, retrievedData.length);
            } catch (error) {
                console.error(`${storageType} - Storage limit exceeded:`, error);
            }
        }
        // 测试 localStorage 存储空间限额
        console.log('Testing localStorage:');
        testStorageLimit('localStorage');
        // 测试 sessionStorage 存储空间限额
        console.log('\nTesting sessionStorage:');
        testStorageLimit('sessionStorage');
    </script>
</body>
</html>

在这里插入图片描述
当存储空间已满,尝试通过setItem()方法添加更多数据时,浏览器会抛出一个QuotaExceededError异常。这意味着应用程序无法再向localStoragesessionStorage中写入任何新数据。

2.最后一次溢出的字符串是会存储到最大容量停止还是不会存储?

最后一次尝试存储超出容量的字符串,浏览器会拒绝存储,并且不会将该字符串存储到 localStorage 或 sessionStorage 中。 在存储空间达到限额后,任何进一步的存储操作都会失败,浏览器不会尝试将超出容量的数据存储到客户端存储中。

下面是一个简单的网页测试,点击按钮会尝试向 localStorage 存储增加 500KB 的数据。测试结果将会显示存储是否成功,以及当前的存储大小。(注意:如果使用相同的键(key)向 localStorage 或 sessionStorage 存储数据,新数据会覆盖掉旧数据。)

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Storage Test</title>
        <script>
            function updateStorage() {
                try {
                    const dataSize = 500 * 1024; // 500KB
                    const existingData = localStorage.getItem('testData') || '';
                    const newData = 'a'.repeat(dataSize);
                    const totalSize = (existingData.length + newData.length) / 1024; // 转换为KB

                    localStorage.setItem('testData', existingData + newData);
                    console.log(`存储成功,总共存储了 ${totalSize} KB 的数据。`);
                    document.getElementById(
                        'result',
                    ).innerText += `\n存储成功,总共存储了 ${totalSize} KB 的数据。`;
                } catch (error) {
                    console.error('存储失败:', error);
                    document.getElementById('result').innerText += '\n存储失败: 存储限额已满。';
                }
            }
        </script>
    </head>
    <body>
        <button onclick="updateStorage()">增加500KB的存储</button>
        <div id="result"></div>
    </body>
</html>

在这里插入图片描述
在这里插入图片描述

3.总结

对于存储限制,通常情况下,每个域名的localStorage和sessionStorage的总存储空间大约为5MB至10MB,具体大小可能因浏览器而异。当接近或达到这个存储限制时,会发生以下情况:

  • 无法再添加新数据: 当存储空间已满,尝试通过setItem()方法添加更多数据时,浏览器会抛出一个QuotaExceededError异常。这意味着应用程序无法再向localStorage或sessionStorage中写入任何新数据。
  • 不会自动覆盖已有数据: 即使存储空间满了,已存储的数据也不会被自动替换或删除。浏览器不会为了腾出空间而清除旧数据,而是直接拒绝新增数据的请求。

4.如何给localStorage扩容?

localStorage的容量是有限制的,通常是由浏览器设定的,并且不同的浏览器可能具有不同的限制。一般来说,这个限制大约在5MB左右。

由于这些限制是由浏览器本身设定的,因此作为开发者,你无法直接“扩容” localStorage。但是,你可以采取一些策略来更有效地使用 localStorage,或者寻找替代方案来存储更多的数据。

4.1 优化数据存储

  • 在将数据保存到 localStorage 之前,先对其进行压缩(例如,使用 pako 或类似的库进行gzip压缩)。
  • 如果可能的话,尝试减少存储的数据量。例如,只保存必要的信息,而不是整个对象或数组。
  • 定期清理不再需要的数据。

4.2 使用IndexedDB

IndexedDB 是一种更强大的浏览器内数据库,它提供了更大的存储容量和更复杂的查询功能。虽然它的API比 localStorage 更复杂一些,但它是一个很好的替代方案,特别是当你需要存储大量数据时。

4.3 使用Web SQL(已弃用,但某些环境仍可用)

Web SQL 是一种已经在某些浏览器中实现的数据库技术。然而,它已经被W3C弃用,因此不建议用于新的开发项目。但如果你正在维护一个已经使用Web SQL的旧项目,并且需要在特定环境中增加存储容量,那么可以考虑继续使用它。

4.4 使用服务器端存储

如果你的应用需要存储大量数据,并且客户端存储不是最佳选择(例如,出于安全或隐私原因),那么可以考虑使用服务器端存储。通过API调用将数据发送到服务器,并在需要时从服务器检索数据。

4.5 分割数据

如果你确实需要在客户端存储大量数据,并且无法使用IndexedDB或其他替代方案,那么可以尝试将数据分割成多个部分,并分别存储在 localStorage 中。然后,你可以编写逻辑来按需检索和组合这些数据部分。

4.6 提示用户

当 localStorage 空间不足时,向用户显示一条友好的消息,解释为什么需要更多的存储空间,并请求他们清理浏览器缓存或执行其他操作来释放空间。

4.7 第三方库处理

  • localforage
  • idb-keyval

详细内容见https://juejin.cn/post/7163075131261059086

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳与星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值