如何找到localStorage的大小

IT技术 javascript html local-storage
2021-02-05 04:23:48

我目前正在开发一个将使用 HTML5 的 localStorage 的站点。我已经阅读了有关不同浏览器的大小限制的所有信息。但是,我还没有看到有关如何找出 localStorage 实例的当前大小的任何信息。这个问题似乎表明 JavaScript 没有内置的方式来显示给定变量的大小。localStorage 是否有我没见过的内存大小属性?有没有一种简单的方法可以做到这一点,我错过了?

我的站点旨在允许用户以“离线”模式输入信息,因此能够在存储空间快满时向他们发出警告非常重要。

6个回答

在 JavaScript 控制台中执行此代码段(一行版本):

var _lsTotal=0,_xLen,_x;for(_x in localStorage){ if(!localStorage.hasOwnProperty(_x)){continue;} _xLen= ((localStorage[_x].length + _x.length)* 2);_lsTotal+=_xLen; console.log(_x.substr(0,50)+" = "+ (_xLen/1024).toFixed(2)+" KB")};console.log("Total = " + (_lsTotal / 1024).toFixed(2) + " KB");


多行相同的代码以供阅读

var _lsTotal = 0,
    _xLen, _x;
for (_x in localStorage) {
    if (!localStorage.hasOwnProperty(_x)) {
        continue;
    }
    _xLen = ((localStorage[_x].length + _x.length) * 2);
    _lsTotal += _xLen;
    console.log(_x.substr(0, 50) + " = " + (_xLen / 1024).toFixed(2) + " KB")
};
console.log("Total = " + (_lsTotal / 1024).toFixed(2) + " KB");

或将此文本添加到书签的“位置”字段中以方便使用

javascript: var x, xLen, log=[],total=0;for (x in localStorage){if(!localStorage.hasOwnProperty(x)){continue;} xLen =  ((localStorage[x].length * 2 + x.length * 2)/1024); log.push(x.substr(0,30) + " = " +  xLen.toFixed(2) + " KB"); total+= xLen}; if (total > 1024){log.unshift("Total = " + (total/1024).toFixed(2)+ " MB");}else{log.unshift("Total = " + total.toFixed(2)+ " KB");}; alert(log.join("\n")); 

PS 片段根据评论中的要求更新。现在计算包括密钥本身的长度。每个长度乘以2,因为javascript中的char存储为UTF-16(占用2个字节)

PPS 应该适用于 Chrome 和 Firefox。

@Serge,这个答案投票最多,因此张贴在这里 var t = 0; for(var x in localStorage) { t += (x.length + localStorage[x].length) * 2; } console.log(t/1024+ " KB");
2021-03-20 04:23:48
将此粘贴到控制台中以查看总数:var t = 0; for(var x in localStorage){ t += (((localStorage[x].length * 2))); } console.log(t/1024+ " KB");
2021-03-22 04:23:48
@Micah Javascript 在内部使用 UTF16,因此由于每个字符都存储为两个字节,因此您需要将字符数乘以 2 以获得实际使用的空间。(您可能已经发现了这一点,但我认为这里值得一提,因为其他人也有同样的问题)
2021-03-29 04:23:48
这是一个也考虑 NaN 的修改版本: var _lsTotal = 0, _xLen, _x; for (_x in localStorage) { _xLen = (((localStorage[_x].length || 0) + (_x.length || 0)) * 2); _lsTotal += _xLen; console.log(_x.substr(0, 50) + " = " + (_xLen / 1024).toFixed(2) + " KB") }; console.log("Total = " + (_lsTotal / 1024).toFixed(2) + " KB");
2021-04-10 04:23:48
书签中有一个错误。您在主代码中使用下划线变量,在书签中使用普通名称。单下划线_x打破它。只需删除下划线。
2021-04-12 04:23:48

根据@Shourav 上面所说的,我编写了一个小函数,它应该准确地获取所有localStorage键(对于当前域)并计算组合大小,以便您确切知道localStorage对象占用了多少内存

var localStorageSpace = function(){
        var allStrings = '';
        for(var key in window.localStorage){
            if(window.localStorage.hasOwnProperty(key)){
                allStrings += window.localStorage[key];
            }
        }
        return allStrings ? 3 + ((allStrings.length*16)/(8*1024)) + ' KB' : 'Empty (0 KB)';
    };

我的回来了: "30.896484375 KB"

谢谢@tennisgent。我的适用于 IE11,FF > 26 和 Chrome。
2021-03-29 04:23:48

您可以使用Blob 函数获取本地存储数据的当前大小这可能不会在旧的浏览器工作,检查的支持new Blob,并Object.values()在caniuse。

例子:

return new Blob(Object.values(localStorage)).size;

Object.values() 将 localStorage 对象转换为数组。Blob 将数组转换为原始数据。

Blob将包含一个文本。UTF-8 文本。虽然localStorage将值存储为 UTF-16。因此,它会打印大约小 2 倍的值。
2021-03-17 04:23:48
2021-03-31 04:23:48
我得到 195...195 什么?
2021-04-05 04:23:48
我使用了 Jed 的答案,该答案使用字符串长度计算 localStorage 大小来测试 Chrome 和 FF 中的 Blob 解决方案。在第一次测试中,我用符号“1”填充了 localStorage。在第二个测试中,我用符号 ''☃'' 填充 localStorage,它在 Blob 对象中具有更大的尺寸。在这两种情况下,我得到的最大 localStorage 长度完全相同。所以字符的 Blob 大小不会影响 localStorage 限制。这就是为什么不应该将 Blob 用于此目的。
2021-04-13 04:23:48
我认为Blob不会将字符串编码限制为 UTF-16,因此这实际上可能是最可靠的方法。new Blob(['X']).size;= 1 而new Blob(['☃']).size(U+2603 / 雪人字符) ==> 3. 基于的解决方案String.prototype.length不考虑这一点(处理“字符”)而存储配额/限制可能会考虑(处理字节),我可以想象这会导致意外,例如,在存储非英语/ASCII 字符时。
2021-04-14 04:23:48

IE 具有Storage 对象剩余空间属性。其他浏览器此时没有等效项。

我相信默认的空间量是 5MB,虽然我没有亲自测试过。

是每个站点的 5 mb 限制还是所有站点的总体限制?
2021-03-18 04:23:48
@divyenduz 每个站点,我认为
2021-03-29 04:23:48
请注意,localStorage.remainingSpace 属性返回存储对象允许的剩余 UTF-16 字符数。不是以字节为单位的剩余大小。参考
2021-04-12 04:23:48
这是一个 IE onlyproperty
2021-04-14 04:23:48

这是如何执行此操作的简单示例,并且应该适用于每个浏览器

alert(1024 * 1024 * 5 - unescape(encodeURIComponent(JSON.stringify(localStorage))).length);
这是否以字节或位为单位给出大小?
2021-03-15 04:23:48
你不需要*8在那里的某个地方吗?
2021-03-20 04:23:48
此示例错误地假设 localStorage 在每个浏览器中具有相同的 5MB (5 * 1024 * 1024) 固定限制。
2021-03-22 04:23:48
这是根据 w3c 提出的规范。
2021-04-02 04:23:48
取决于不考虑的字符集(即 utf8 等)
2021-04-13 04:23:48