Tôi đã cô đọng một bài kiểm tra nhị phân vào chức năng này mà tôi sử dụng:
function getStorageTotalSize(upperLimit/*in bytes*/) {
var store = localStorage, testkey = "$_test"; // (NOTE: Test key is part of the storage!!! It should also be an even number of characters)
var test = function (_size) { try { store.removeItem(testkey); store.setItem(testkey, new Array(_size + 1).join('0')); } catch (_ex) { return false; } return true; }
var backup = {};
for (var i = 0, n = store.length; i < n; ++i) backup[store.key(i)] = store.getItem(store.key(i));
store.clear(); // (you could iterate over the items and backup first then restore later)
var low = 0, high = 1, _upperLimit = (upperLimit || 1024 * 1024 * 1024) / 2, upperTest = true;
while ((upperTest = test(high)) && high < _upperLimit) { low = high; high *= 2; }
if (!upperTest) {
var half = ~~((high - low + 1) / 2); // (~~ is a faster Math.floor())
high -= half;
while (half > 0) high += (half = ~~(half / 2)) * (test(high) ? 1 : -1);
high = testkey.length + high;
}
if (high > _upperLimit) high = _upperLimit;
store.removeItem(testkey);
for (var p in backup) store.setItem(p, backup[p]);
return high * 2; // (*2 because of Unicode storage)
}
Nó cũng sao lưu nội dung trước khi thử nghiệm, sau đó khôi phục chúng.
Cách thức hoạt động: Nó nhân đôi kích thước cho đến khi đạt đến giới hạn hoặc thử nghiệm thất bại. Sau đó, nó lưu trữ một nửa khoảng cách giữa thấp và cao và trừ / thêm một nửa của một nửa mỗi lần (trừ vào thất bại và thêm vào thành công); mài giũa vào giá trị thích hợp.
upperLimit
là 1GB theo mặc định và chỉ giới hạn mức độ quét lên theo cấp số nhân trước khi bắt đầu tìm kiếm nhị phân. Tôi nghi ngờ điều này thậm chí sẽ cần phải được thay đổi, nhưng tôi luôn suy nghĩ về phía trước. ;)
Trên Chrome:
> getStorageTotalSize();
> 10485762
> 10485762/2
> 5242881
> localStorage.setItem("a", new Array(5242880).join("0")) // works
> localStorage.setItem("a", new Array(5242881).join("0")) // fails ('a' takes one spot [2 bytes])
IE11, Edge và FireFox cũng báo cáo kích thước tối đa tương tự (10485762 byte).