Сколько места занимает сам ключ localstorage?

допустим, я создаю ключ localstorage и даю ему пустую строку. Занимает ли имя keyitem столько же места, сколько значение на символ?

например тут

localStorage.setItem("keyitem","") 
//Equal the space of this other one under?
localStorage.setItem("key","item");

кроме того, имеет ли значение количество ключей? например,

localStorage.setItem("key","");
//Equal the amount of storage as the 3 under combined? 
localStorage.setItem("k","");
localStorage.setItem("o","");
localStorage.setItem("h","");

5 ответов


Я нашел функцию один раз, чтобы вычислить размер localStorage и sessionStorage объекты, но я не могу вспомнить, где я его нашел.

вот код:

Storage.prototype.size = function(units) {
    'use strict';
    units = units ? units.toUpperCase() : 'MB';
    var size = unescape(encodeURIComponent(JSON.stringify(this))).length;
    switch (units) {
        case 'B': return [size,'B'].join(' ');
        case 'KB': return [+(size / 1024).toFixed(3),'KB'].join(' ');
        default: return [+(size / 1024 / 1024).toFixed(3),'MB'].join(' ');
    }
};

я решил пойти дальше и запустить некоторые тесты в различных браузерах.

Firefox (37.0.2):

Firefox console output

хром (42.0.2311.90 м):

Chrome console output

IE 11 (11.0.9600.17420):

IE Console Output

Opera (29.0.1795.47):

Opera console output

таким образом, похоже, что FireFox, Chrome и Opera (возможно, Safari, но у меня этого нет) имеют одинаковое поведение, а ключи занимают гораздо больше места, чем их значения.

в IE (старый добрый IE...), реализация выполняется таким образом, что не имеет значения, как вы что-то храните.


занимает ли имя keyitem столько же места, сколько и значение будет на символ?

нет, не надо. Объем пространства, занятого ключом, может быть больше, чем объем пространства, занятого значением. Но вместе с ключом и значением должна быть около 5МБ(хотя это отличается от браузера, поскольку он зависит от браузера)

вы можете использовать этот код для проверки:

localStorage.clear();
localStorage.setItem(new Array(5e6).join(' '),'');
localStorage.key(0).length;

выход на Chrome для вышеуказанного теста:

enter image description here

Так comes under 5MB(что в основном является верхним пределом для большинства браузеров) ключ может иметь любую длину


вы можете определить это самостоятельно, используя JSON stringify методы для превращения объекта localStorage в объект JSON:

JSON.stringify(localStorage).length

Это не вернет фактический размер ключа, поскольку данные могут храниться как utf16 (2 байта) или utf8 (1 байт), но это хороший прокси для фактического размера. См. фрагмент кода ниже:

 localStorage.clear()
 localStorage.setItem("keyitem","") 
 document.write(JSON.stringify(localStorage).length+'</br>')

 //Equal the space of this other one under?
 localStorage.setItem("key","item");
 document.write(JSON.stringify(localStorage).length+'</br>')

 localStorage.clear();
 localStorage.setItem("key","");
 document.write(JSON.stringify(localStorage).length+'</br>')


 //Equal the amount of storage as the 3 under combined? 
 localStorage.setItem("k","");
 localStorage.setItem("o","");
 localStorage.setItem("h","");
 document.write(JSON.stringify(localStorage).length+'</br>')

Я бы сказал, что это деталь реализации для того, что касается реальной структуры хранилища на диске.

на практике вам дается определенное количество места на источник (обычно 5MiB, чтобы проверить фактическое хранилище, вы можете использовать это средство проверки связанные в документах MDN), и вы можете хранить данные (как с точки зрения ключей, так и значений) до тех пор, пока вы не превысите этот размер, как показано в предыдущем ответе. Так что да ключи включены в квота хранения.

как указано в тестовом инструменте, который я включил, символы на самом деле UTF-16, поэтому они занимают 2 байта вашей квоты хранения.

также обратите внимание, что в хранилище хранятся строки, это означает, что если вы помещаете большой float в качестве ключа или значения, вы сохраняете его не в двоичном формате, а в виде строк!

// These takes up the same space
localStorage.setItem("a", 123);
localStorage.setItem("a", "123");

на самом деле, если вы попытаетесь сделать typeof следующего вы получите string в обоих случаях

localStorage.setItem("123", "");
localStorage.setItem(123, "");
typeof localStorage.key(0); // returns "string"
typeof localStorage.key(1); // returns "string" as well

что касается второй части, в условия хранения это

localStorage.setItem("k","");
localStorage.setItem("o","");
localStorage.setItem("h","");

должен принимать 3 символа хранения из вашей квоты, то есть 3 * 2 байта при использовании UTF-16 или 3 байта при использовании UTF-8.

для обзора локальных решений для хранения вы можете проверить здесь http://www.html5rocks.com/en/features/storage


Я провел тест в Chrome и смог доказать, что ключ занимает ровно столько же места, сколько и длина.

С ключом abc, Я смог установить значение длины 5242877. С ключом a, я смог установить значение длины 5242879. Как вы можете видеть, удаление символов из ключа освободило эти 2 для значения.