Javascript метод storage.setitem()
Содержание:
- Full Example
- JavaScript
- The JavaScript localStorage object
- Get Started
- Поиск по индексированному полю
- Usage
- Honorable Mentions
- Storage event
- Integrating local storage
- localStorage limitations
- LogRocket: Debug JavaScript errors easier by understanding the context
- Types
- Changelog
- cookie.isSupported
- Слежение за областью HTML5-хранилища
- Курсоры
- Тест скорости выполнения операций с данными в localStorage и cookie
- Properties
- Веб-хранилище. Назначение localStorage и sessionStorage
Full Example
import React, { Fragment } from 'react'; import { render } from 'react-dom'; import { writeStorage, deleteFromStorage, useLocalStorage } from '@rehooks/local-storage'; const startingNum = ; const Clicker = () => ( <Fragment> <h4>Clicker<h4> <button onClick={_ => { writeStorage('num', localStorage.getItem('num') ? +(localStorage.getItem('num')) + 1 : startingNum ) }}> Increment From Outside <button> <button onClick={_ => deleteFromStorage('num')}> Delete From Outside <button> <Fragment> ); const IncrememterWithButtons = () => { const number, setNum, deleteNum = useLocalStorage('num'); return ( <Fragment> <p>{typeof(number) === 'number' ? number : 'Try incrementing the number!'}<p> <button onClick={_ => setNum(number !== null ? +(number) + 1 : startingNum)}>Increment<button> <button onClick={deleteNum}>Delete<button> <Fragment> ); }; const App = () => ( <Fragment> <h1> Demo <h1> <IncrememterWithButtons > <Clicker > <Fragment> ); // Assuming there is a div in index.html with an ID of 'root' render(<App >, document.getElementById('root'));
JavaScript
JS Array
concat()
constructor
copyWithin()
entries()
every()
fill()
filter()
find()
findIndex()
forEach()
from()
includes()
indexOf()
isArray()
join()
keys()
length
lastIndexOf()
map()
pop()
prototype
push()
reduce()
reduceRight()
reverse()
shift()
slice()
some()
sort()
splice()
toString()
unshift()
valueOf()
JS Boolean
constructor
prototype
toString()
valueOf()
JS Classes
constructor()
extends
static
super
JS Date
constructor
getDate()
getDay()
getFullYear()
getHours()
getMilliseconds()
getMinutes()
getMonth()
getSeconds()
getTime()
getTimezoneOffset()
getUTCDate()
getUTCDay()
getUTCFullYear()
getUTCHours()
getUTCMilliseconds()
getUTCMinutes()
getUTCMonth()
getUTCSeconds()
now()
parse()
prototype
setDate()
setFullYear()
setHours()
setMilliseconds()
setMinutes()
setMonth()
setSeconds()
setTime()
setUTCDate()
setUTCFullYear()
setUTCHours()
setUTCMilliseconds()
setUTCMinutes()
setUTCMonth()
setUTCSeconds()
toDateString()
toISOString()
toJSON()
toLocaleDateString()
toLocaleTimeString()
toLocaleString()
toString()
toTimeString()
toUTCString()
UTC()
valueOf()
JS Error
name
message
JS Global
decodeURI()
decodeURIComponent()
encodeURI()
encodeURIComponent()
escape()
eval()
Infinity
isFinite()
isNaN()
NaN
Number()
parseFloat()
parseInt()
String()
undefined
unescape()
JS JSON
parse()
stringify()
JS Math
abs()
acos()
acosh()
asin()
asinh()
atan()
atan2()
atanh()
cbrt()
ceil()
clz32()
cos()
cosh()
E
exp()
expm1()
floor()
fround()
LN2
LN10
log()
log10()
log1p()
log2()
LOG2E
LOG10E
max()
min()
PI
pow()
random()
round()
sign()
sin()
sqrt()
SQRT1_2
SQRT2
tan()
tanh()
trunc()
JS Number
constructor
isFinite()
isInteger()
isNaN()
isSafeInteger()
MAX_VALUE
MIN_VALUE
NEGATIVE_INFINITY
NaN
POSITIVE_INFINITY
prototype
toExponential()
toFixed()
toLocaleString()
toPrecision()
toString()
valueOf()
JS OperatorsJS RegExp
constructor
compile()
exec()
g
global
i
ignoreCase
lastIndex
m
multiline
n+
n*
n?
n{X}
n{X,Y}
n{X,}
n$
^n
?=n
?!n
source
test()
toString()
(x|y)
.
\w
\W
\d
\D
\s
\S
\b
\B
\0
\n
\f
\r
\t
\v
\xxx
\xdd
\uxxxx
JS Statements
break
class
continue
debugger
do…while
for
for…in
for…of
function
if…else
return
switch
throw
try…catch
var
while
JS String
charAt()
charCodeAt()
concat()
constructor
endsWith()
fromCharCode()
includes()
indexOf()
lastIndexOf()
length
localeCompare()
match()
prototype
repeat()
replace()
search()
slice()
split()
startsWith()
substr()
substring()
toLocaleLowerCase()
toLocaleUpperCase()
toLowerCase()
toString()
toUpperCase()
trim()
valueOf()
The JavaScript localStorage object
HTML5 specification introduces the as a way to store data with no expiration date in the web browsers.
In other words, the data stored in the browsers will persist even after you close the browser windows.
The data stored in the is bound to an origin. It means that the is unique per .
First, the data stored in the isn’t sent to the server in every request like cookies. For this reason, you can store more data in the .
Most modern web browsers allow you to store up to 5MB of data in the . Note that you can store up to 4KB in cookies.
Second, the data stored in the can be managed by the client, specifically JavaScript in the web browser. It cannot be accessible by the servers.
However, cookies can be managed by both JavaScript in web browsers and servers.
Accessing the localStorage
You can access the via the property of the object:
Since the is an instance of the type, you can invoke the methods of the type to manage data.
When you type the following code in the Console:
… you’lll see the following object:
1) The setItem() method
The following uses the method to store a name-value pair in the :
2) The length property
To get the number of name-value pairs, you use the property like this:
Since the object is global, you don’t need to explicitly specify it. For example:
3) The getItem() method
To get the value by a key, you use the method. The following example uses the method to get the value of key:
4) The removeItem() method
To remove a name-value pair by a key, you use the method. For example:
5) Loop over keys of the localStorage object
The following stores three name-value pairs to the :
To iterate over name-value pairs stored in the , you use the method with loop:
Output:
Get Started
(1) You can install angular-local-storage using 3 different ways:Git:
clone & build this repositoryBower:
$ bower install angular-local-storage --save
npm:
$ npm install angular-local-storage
(2) Include (or ) from the dist directory in your , after including Angular itself.
(3) Add to your main module’s list of dependencies.
When you’re done, your setup should look similar to the following:
<!doctype html> <html ng-app="myApp"> <head> </head> <body> ... <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.min.js"></script> <script src="bower_components/js/angular-local-storage.min.js"></script> ... <script> var myApp = angular.module('myApp', 'LocalStorageModule'); </script> ... </body> </html>
Поиск по индексированному полю
Для поиска по другим полям объекта нам нужно создать дополнительную структуру данных, называемую «индекс» (index).
Индекс является «расширением» к хранилищу, которое отслеживает данное поле объекта. Для каждого значения этого поля хранится список ключей для объектов, которые имеют это значение. Ниже будет более подробная картина.
Синтаксис:
- – название индекса,
- – путь к полю объекта, которое индекс должен отслеживать (мы собираемся сделать поиск по этому полю),
-
– необязательный объект со свойствами:
- – если true, тогда в хранилище может быть только один объект с заданным значением в . Если мы попытаемся добавить дубликат, то индекс сгенерирует ошибку.
- – используется только, если является массивом. В этом случае, по умолчанию, индекс обрабатывает весь массив как ключ. Но если мы укажем true в , тогда индекс будет хранить список объектов хранилища для каждого значения в этом массиве. Таким образом, элементы массива становятся ключами индекса.
В нашем примере мы храним книги с ключом .
Допустим, мы хотим сделать поиск по полю .
Сначала нам нужно создать индекс. Индексы должны создаваться в , как и хранилище объектов:
- Индекс будет отслеживать поле .
- Поле price не уникальное, у нас может быть несколько книг с одинаковой ценой, поэтому мы не устанавливаем опцию .
- Поле price не является массивом, поэтому флаг не применим.
Представим, что в нашем есть 4 книги. Вот картинка, которая показывает, что такое «индекс».
Как уже говорилось, индекс для каждого значения (второй аргумент) хранит список ключей, имеющих эту цену.
Индексы автоматически обновляются, нам не нужно об этом заботиться.
Мы также можем использовать , чтобы создать диапазон и найти дешёвые/дорогие книги:
Индексы внутренне отсортированы по полю отслеживаемого объекта, в нашем случае по . Поэтому результат поиска будет уже отсортированный по полю .
Usage
unless localStorage?{LocalStorage} =require('')localStorage =newLocalStorage('./scratch')localStorage.setItem('myFirstKey', 'myFirstValue')console.log(localStorage.getItem('myFirstKey'))localStorage._deleteLocation()
Open or create and add these two lines:
// /src/setupTests.jsimport { LocalStorage } from "node-localstorage";global.localStorage = new LocalStorage('./scratch');
if (typeof localStorage === "undefined" || localStorage === null) { var LocalStorage = require('node-localstorage').LocalStorage; localStorage = new LocalStorage('./scratch');}localStorage.setItem('myFirstKey', 'myFirstValue');console.log(localStorage.getItem('myFirstKey'));
Polyfil your node.js environment with this as the global localStorage when launching your own code
node -r node-localstorage/register my-code.js
Honorable Mentions
The above tools will probably help you do just about anything you want in localStorage, but if you’re looking for more, here are a few more related tools and libraries you might want to check out.
- LokiJS – A fast, in-memory document-oriented datastore for node.js, browser, and Cordova.
- Client Storage for AngularJS – Namespaced client storage for Angular JS. Writes to localStorage, with cookie fallback. No external dependencies other than Angular core; does not depend on ngCookies.
- AlaSQL.js – JavaScript SQL database for browser and Node.js. Handles both traditional relational tables and nested JSON data (NoSQL). Export, store, and import data from localStorage, IndexedDB, or Excel.
- angular-locker – A simple and configurable abstraction for local/session storage in angular projects, providing a fluent api that is powerful and easy to use.
- jsCache – Enables caching of JavaScript files, CSS stylesheets, and images using localStorage.
- LargeLocalStorage – Overcomes various browser deficiencies to offer a large key-value store on the client.
Storage event
When the data gets updated in or , event triggers, with properties:
- – the key that was changed ( if is called).
- – the old value ( if the key is newly added).
- – the new value ( if the key is removed).
- – the url of the document where the update happened.
- – either or object where the update happened.
The important thing is: the event triggers on all objects where the storage is accessible, except the one that caused it.
Let’s elaborate.
Imagine, you have two windows with the same site in each. So is shared between them.
You might want to open this page in two browser windows to test the code below.
If both windows are listening for , then each one will react on updates that happened in the other one.
Please note that the event also contains: – the url of the document where the data was updated.
Also, contains the storage object – the event is the same for both and , so references the one that was modified. We may even want to set something back in it, to “respond” to a change.
That allows different windows from the same origin to exchange messages.
Modern browsers also support Broadcast channel API, the special API for same-origin inter-window communication, it’s more full featured, but less supported. There are libraries that polyfill that API, based on , that make it available everywhere.
Integrating local storage
Now we’re going to add a few more bits of functionality to the app. First, every time the form is submitted, the value should be added to the as well as appear on the front end. We’ll also want to loop through all the existing local storage items and display them at the top of the list. Last, we want the «Clear All» button to remove all items from local storage as well as the front end.
Let’s create an empty array to start, and create a key called «items». Now, only supports strings as values, and want to store our to-dos in an array.
We can get around this by using to convert a data array to a string. We’ll use to convert the contents of back into something we can work with later in the variable. Put this code below all the constant declarations we set earlier.
scripts.js
In the form event listener, let’s push any new value into the array, then set the to the new, updated value.
scripts.js
We’re going to loop through everything in our variable above, which contains all the existing data in a form JavaScript can understand and work with, and we’ll run the again. This will display all existing stored information on the front end every time we open the app.
scripts.js
Last, we’ll add a click event to the button that will clear all data from , as well as removing every child node from the .
scripts.js
If all went well, everything will save to storage as well as appear on the front end, which you can check by testing in the console.
There’s one final problem: after closing the browser or reloading the page, all the existing information in is gone, and nothing remains on the front end. Why?
Our is being reset to an empty array every time the script runs. We could fix this by making a conditional statement that checks if already exists, such as in the below example.
scripts.js
A little more concise would be to use a to do the same thing.
scripts.js
With that, our app is complete! Now when you enter in some information and refresh or close the browser window, the data will persist until you manually clear the data in Developer Tools (under Application -> Storage) or by running the command. Here is the full JavaScript code.
scripts.js
Here is the demo and source code once again.
- View Demo
- View Source
localStorage limitations
As easy as it is to use , it is also easy to misuse it. The following are limitations, and also ways to NOT use :
- Do not store sensitive user information in
- It is not a substitute for a server based database as information is only stored on the browser
- is limited to 5MB across all major browsers
- is quite insecure as it has no form of data protection and can be accessed by any code on your web page
- is synchronous, meaning each operation called would only execute one after the other
With these, we have been armed with the power of in our web applications.
LogRocket: Debug JavaScript errors easier by understanding the context
Debugging code is always a tedious task. But the more you understand your errors the easier it is to fix them.
LogRocket allows you to understand these errors in new and unique ways. Our frontend monitoring solution tracks user engagement with your JavaScript frontends to give you the ability to find out exactly what the user did that led to an error.
LogRocket records console logs, page load times, stacktraces, slow network requests/responses with headers + bodies, browser metadata, and custom logs. Understanding the impact of your JavaScript code will never be easier!
Try it for free.
Types
StorageArea
Properties
-
clear
functionPromise
Removes all items from storage.
The clear function looks like this:
-
get
functionPromise
Gets one or more items from storage.
The get function looks like this:
-
keys
string | string[] | object optionalA single key to get, list of keys to get, or a dictionary specifying default values (see description of the object). An empty list or object will return an empty result object. Pass in to get the entire contents of storage.
-
callback
functionCallback with storage items, or on failure (in which case will be set).
The parameter should be a function that looks like this:
-
-
getBytesInUse
functionPromise
Gets the amount of space (in bytes) being used by one or more items.
The getBytesInUse function looks like this:
-
keys
string | string[] optionalA single key or list of keys to get the total usage for. An empty list will return 0. Pass in to get the total usage of all of storage.
-
callback
functionCallback with the amount of space being used by storage, or on failure (in which case will be set).
The parameter should be a function that looks like this:
-
-
onChanged
<function>Chrome 73+
Fired when one or more items change.
-
listener
functionThe listener parameter should be a function that looks like this:
-
-
remove
functionPromise
Removes one or more items from storage.
The remove function looks like this:
-
keys
string | string[]A single key or a list of keys for items to remove.
-
callback
function optionalCallback on success, or on failure (in which case will be set).
If you specify the parameter, it should be a function that looks like this:
-
-
set
functionPromise
Sets multiple items.
The set function looks like this:
-
items
objectAn object which gives each key/value pair to update storage with. Any other key/value pairs in storage will not be affected.
Primitive values such as numbers will serialize as expected. Values with a and will typically serialize to , with the exception of (serializes as expected), , and (serialize using their representation).
-
callback
function optionalCallback on success, or on failure (in which case will be set).
If you specify the parameter, it should be a function that looks like this:
-
Properties
-
newValue
any optionalThe new value of the item, if there is a new value.
-
oldValue
any optionalThe old value of the item, if there was an old value.
Changelog
- 2.1.6 — 2020-04-10 — Fix backward compatibility bug (thanks @WillBartee)
- 2.1.5 — 2019-12-02 — Fixed empty string key(n) return (@appy-one, thanks for reporting)
- 2.1.2 thru 2.1.4 — 2019-11-17 — Upgrading and testing npm publish scripts
- 2.1.1 — 2019-11-17 — npm publish cleanup
- 2.1.0 — 2019-11-17 — Added back dot-property and associative-array syntax using ES6 Proxy
- 2.0.0 — 2019-11-17 — Updated all the depdendencies, added ability to register as polyfill (thanks @dy)
- 1.3.1 — 2018-03-19 — Resolves issue #32 (thanks, plamens)
- 1.3.0 — 2016-04-09 — Possibly backward breaking if you were using experimental syntax Reverted experimental
associative array and dot-property syntax. The API for Proxy changed with node.js v6.x which broke it. Then when
I switched to the new syntax, it broke the EventEmitter functionality. Will restore once I know how to fix that. - 1.2.0 — 2016-04-09 — Atomic writes (thanks, mvayngrib)
- 1.1.2 — 2016-01-08 — Resolves issue #17 (thanks, evilaliv3)
- 1.1.1 — 2016-01-04 — Smarter associative array and dot-property syntax support
- 1.1.0 — 2016-01-03 — Backward breaking if you used any of the non-standard methods. They are now all preceded with
an underscore. Big upgrade for this version is experimental support for associative array and dot-property syntax. - 1.0.0 — 2016-01-03 — Fixed bug with empty string key (thanks, tinybike)
- 0.6.0 — 2015-09-11 — Removed references to deprecated fs.existsSync() (thanks, josephbosire)
- 0.5.2 — 2015-08-01 — Fixed defect where keys were not being updated correctly by removeItem() (thanks, ed69140)
- 0.5.1 — 2015-06-01 — Added support for events
- 0.5.0 — 2015-02-02 — Added JSONStorage class which allows you set and get native JSON
- 0.4.1 — 2015-02-02 — More robust publishing/tagging (like Lumenize)
- 0.4.0 — 2015-02-02 — Uses more efficient fs.statSync to set initial size (thanks, sudheer594)
- 0.3.6 — 2014-12-24 — Allows usage without
- 0.3.5 — 2014-12-23 — Fixed toString() for QuotaExceededError
- 0.3.4 — 2013-07-07 — Moved CoffeeScript to devDependencies
- 0.3.3 — 2013-04-05 — Added support for ‘/’ in keys by escaping before creating file names
- 0.3.2 — 2013-01-19 — Renamed QuotaExceededError to QUOTA_EXCEEDED_ERR to match most browsers
- 0.3.1 — 2013-01-19 — Fixed bug where it threw plain old Error instead of new QuotaExceededError
- 0.3.0 — 2013-01-19 — Added QuotaExceededError support
- 0.2.0 — 2013-01-03 — Added quota support
- 0.1.2 — 2012-11-02 — Finally got Travis CI working
- 0.1.1 — 2012-10-29 — Update to support Travis CI
- 0.1.0 — 2012-10-29 — Original version
Checks if cookies are enabled in the browser.
Returns:
myApp.controller('MainCtrl', function($scope, localStorageService) { //... if(localStorageService.cookie.isSupported) { //... } //... });
Directly adds a value to cookies.Note: Typically used as a fallback if local storage is not supported.Returns:
myApp.controller('MainCtrl', function($scope, localStorageService) { //... function submit(key, val) { return localStorageService.cookie.set(key, val); } //... });
Cookie Expiry Pass a third argument to specify number of days to expiry
localStorageService.cookie.set(key,val,10)
localStorageService.cookie.set(key,val,null,false)
sets a cookie that is secure.
Directly get a value from a cookie.Returns:
myApp.controller('MainCtrl', function($scope, localStorageService) { //... function getItem(key) { return localStorageService.cookie.get(key); } //... });
Remove directly value from a cookie.Returns:
myApp.controller('MainCtrl', function($scope, localStorageService) { //... function removeItem(key) { return localStorageService.cookie.remove(key); } //... });
Remove all data for this app from cookie.Returns:
myApp.controller('MainCtrl', function($scope, localStorageService) { //... function clearAll() { return localStorageService.cookie.clearAll(); } });
Слежение за областью HTML5-хранилища
Если вы хотите программно отслеживать изменения хранилища, то должны отлавливать событие storage. Это событие возникает в объекте window, когда setItem(), removeItem() или clear() вызываются и что-то изменяют. Например, если вы установили существующее значение или вызвали clear() когда нет ключей, то событие не сработает, потому что область хранения на самом деле не изменилась.
Событие storage поддерживается везде, где работает объект localStorage, включая Internet Explorer 8. IE 8 не поддерживает стандарт W3C addEventListener (хотя он, наконец-то, будет добавлен в IE 9), поэтому, чтобы отловить событие storage нужно проверить, какой механизм событий поддерживает браузер (если вы уже проделывали это раньше с другими событиями, то можете пропустить этот раздел до конца). Перехват события storage работает так же, как и перехват других событий. Если вы предпочитаете использовать jQuery или какую-либо другую библиотеку JavaScript для регистрации обработчиков событий, то можете проделать это и со storage тоже.
if (window.addEventListener) {
window.addEventListener(«storage», handle_storage, false);
} else {
window.attachEvent(«onstorage», handle_storage);
};
Функция обратного вызова handle_storage будет вызвана с объектом StorageEvent, за исключением Internet Explorer, где события хранятся в window.event.
function handle_storage(e) {
if (!e) { e = window.event; }
}
В данном случае переменная e будет объектом StorageEvent, который обладает следующими полезными свойствами.
Свойство | Тип | Описание |
---|---|---|
key | string | Ключ может быть добавлен, удален или изменен. |
oldValue | любой | Предыдущее значение (если переписано) или null, если добавлено новое значение. |
newValue | любой | Новое значение или null, если удалено. |
url* | string | Страница, которая вызывает метод, приведший к изменению. |
* Примечание: свойство url изначально называлось uri и некоторые браузеры поддерживали это свойство перед изменением спецификации. Для обеспечения максимальной совместимости вы должны проверить существует ли свойство url, и если нет проверить вместо него свойство uri.
Событие storage нельзя отменить, внутри функции обратного вызова handle_storage нет возможности остановить изменение. Это просто способ браузеру сказать вам: «Эй, это только что случилось. Вы ничего не можете сделать, я просто хотел, чтобы вы знали».
Курсоры
Такие методы как возвращают массив ключей/значений.
Но хранилище объектов может быть огромным, больше, чем доступно памяти.
Тогда метод вернёт ошибку при попытке получить все записи в массиве.
Что делать?
Курсоры предоставляют возможности для работы в таких ситуациях.
Объект cursor идёт по хранилищу объектов с заданным запросом (query) и возвращает пары ключ/значение по очереди, а не все сразу. Это позволяет экономить память.
Так как хранилище объектов внутренне отсортировано по ключу, курсор проходит по хранилищу в порядке хранения ключей (по возрастанию по умолчанию).
Синтаксис:
- ключ или диапазон ключей, как для .
-
необязательный аргумент, доступные значения:
- – по умолчанию, курсор будет проходить от самого маленького ключа к большему.
- – обратный порядок: от самого большого ключа к меньшему.
- , – то же самое, но курсор пропускает записи с тем же ключом, что уже был (только для курсоров по индексам, например, для нескольких книг с price=5, будет возвращена только первая).
Основным отличием курсора является то, что генерируется многократно: один раз для каждого результата.
Вот пример того, как использовать курсор:
Основные методы курсора:
- – продвинуть курсор на позиций, пропустив значения.
- – продвинуть курсор к следующему значению в диапазоне соответствия (или до позиции сразу после ключа key, если указан).
Независимо от того, есть ли ещё значения, соответствующие курсору или нет – вызывается , затем в мы можем получить курсор, указывающий на следующую запись или равный .
В приведённом выше примере курсор был создан для хранилища объектов.
Но мы также можем создать курсор для индексов. Как мы помним, индексы позволяют искать по полю объекта. Курсоры для индексов работают так же, как для хранилищ объектов – они позволяют экономить память, возвращая одно значение в единицу времени.
Для курсоров по индексам является ключом индекса (например price), нам следует использовать свойство как ключ объекта:
Рассмотрим быстродействие (в процентном отношении), которое имеют методы при выполнении операций с данными в localStorage и cookie.
В качестве браузеров будем использовать Chrome 47, Firefox 42 и IE11, работающие на операционной системе Windows 7.
Тест 1. Быстродействие методов, осуществляющих чтение данных из localStorage и cookie.
Вывод: Современные браузеры выполняют операции чтения данных из хранилища localStorage намного быстрее, чем из cookie. В браузере Google Chrome это разница достигает нескольких десятков раз, в Firefox – 9 раз и в IE 11 – 2 раза.
Тест 2. Быстродействие методов, осуществляющих запись данных в localStorage и cookie.
Вывод: Операции записи данных в хранилище localStorage выполняются быстрее, чем в cookie, но не настолько как при чтении. Браузер Google Chrome выполняет запись в localSorage быстрее в 1.6 раза, Firefox в 7 раз, Internet Explorer 11 показал равнозначный результат.
Тест 3. Быстродействие браузеров, осуществляющих запись данных в localStorage и их чтение.
Вывод: Firefox показал довольно хорошие преимущества в быстродействии перед другими браузерами, и это касается не только технологии localStorage, но и cookie (диаграммы не приводятся).
Properties
local
Items in the storage area are local to each machine.
Properties
QUOTA_BYTES
5242880
The maximum amount (in bytes) of data that can be stored in local storage, as measured by the JSON stringification of every value plus every key’s length. This value will be ignored if the extension has the unlimitedStorage permission. Updates that would cause this limit to be exceeded fail immediately and set runtime.lastError.
managed
Items in the storage area are set by the domain administrator, and are read-only for the extension; trying to modify this namespace results in an error.
Properties
-
MAX_ITEMS
512The maximum number of items that can be stored in sync storage. Updates that would cause this limit to be exceeded will fail immediately and set .
-
MAX_SUSTAINED_WRITE_OPERATIONS_PER_MINUTE
1000000Deprecated
The storage.sync API no longer has a sustained write operation quota.
-
MAX_WRITE_OPERATIONS_PER_HOUR
1800The maximum number of , , or operations that can be performed each hour. This is 1 every 2 seconds, a lower ceiling than the short term higher writes-per-minute limit.
Updates that would cause this limit to be exceeded fail immediately and set .
-
MAX_WRITE_OPERATIONS_PER_MINUTE
120The maximum number of , , or operations that can be performed each minute. This is 2 per second, providing higher throughput than writes-per-hour over a shorter period of time.
Updates that would cause this limit to be exceeded fail immediately and set .
-
QUOTA_BYTES
102400The maximum total amount (in bytes) of data that can be stored in sync storage, as measured by the JSON stringification of every value plus every key’s length. Updates that would cause this limit to be exceeded fail immediately and set .
-
QUOTA_BYTES_PER_ITEM
8192The maximum size (in bytes) of each individual item in sync storage, as measured by the JSON stringification of its value plus its key length. Updates containing items larger than this limit will fail immediately and set .
Веб-хранилище. Назначение localStorage и sessionStorage
Веб-хранилище — это данные, хранящиеся локально в браузере пользователя. Существует 2 типа веб-хранилищ:
- LocalStorage;
- SessionStorage.
В них вы можете хранить информацию в формате ключ-значение. Ключ и значение – это всегда строки.
Если мы попытаемся сохранить в значение элемента хранилища другой тип значений, например, объект, то он будет, перед тем как туда записан, преобразован в строку. В данном случае посредством неявного у него вызова метода . Т.е. в значении элемента этих хранилищ кроме строкового типа данных никакого другого содержаться не может.
Отличие между этими хранилищами сводится только к периоду времени, в течение которого они могут хранить данные, помещенные в них:
- SessionStorage – выполняет это в течение определённого промежутка времени (сессии). Закрытие вкладки или браузера приводит их к удалению. При этом данные в SessionStorage сохраняются при обновлении страницы.
- LocalStorage – осуществляет это в течение неограниченного времени. Они сохраняются при перезагрузке браузера и компьютера. Их длительность хранения ничем не ограничена. Но, хоть эти данные могут храниться бесконечно в браузере, обычный пользователь может их очень просто удалить, например выполнив очистку истории (при включенной опции «файлы cookie и другие данные сайтов»).
Хранилище LocalStorage похоже на cookies. Оно также применяется для хранения данных на компьютере пользователя (в браузере). Но кроме общих сходств имеется также и много отличий.
Cookies vs. LocalStorage: В чём разница
Отличия между cookies и LocalStorage:
- по месту хранения (куки и данные LocalStorage хранятся на компьютере пользователя в браузере);
- по размеру (cookies ограничены 4 Кбайт, а размер LocalStorage — 5 Мбайт);
- по включению этих данных в HTTP-заголовок (куки в отличие от данных локального хранилища включаются в состав запроса при отправке его на сервер, а также сервер их может добавлять в ответ при отправке его клиенту; таким образом cookies являются частью HTTP-протокола, и увеличивают объём передаваемых данных от клиента серверу и обратно);
- по доступности данных (печеньки можно прочитать и установить как на сервере, так и на клиенте; на клиенте доступны все куки, кроме тех, у которых установлен флаг ; LocalStorage доступны только в браузере посредством JavaScript API);
- по времени хранения данных (куки хранятся ограниченное время (до конца сеанса или истечения указанной даты), нахождение данных в локальном хранилище не ограничено по времени);
- по удобству использования в JavaScript (работа с LocalStorage в JavaScript организовано намного удобнее чем с cookies);
- по необходимости информирования пользователей Евросоюза (при использовании cookies сайт в ЕС должен получать на это разрешение от пользователей; для данных локального хранилища это не требуется);
- по назначению (куки в основном используются для управления сеансом, персонализации и отслеживания действий пользователя, в то время как LocalStorage применяется в качестве обычного локального хранилища информации на компьютере пользователя).
Что использовать: LocalStorage или cookies? На самом деле, ответ на этот вопрос очень прост. Если вам не нужно отправлять данные с каждым HTTP-запросом на сервер, то в этом случае лучше использовать для хранения данных LocalStorage.
Безопасность данных
Хранилище LocalStorage привязана к источнику (домену, протоколу и порту). Данные, находящиеся в некотором источнике, доступны для всех сценариев страниц этого же источника. Из сценария, находящегося в одном источнике, нельзя получить доступ к данным, определяемым другим источником.
Хранилище SessionStorage ограничена только одной вкладкой браузера. Это означает, что в сценарии, находящемся в одной вкладке, нельзя получить информацию из сессионного хранилища другой вкладки даже у них одинаковые источники.
Итоги
Основные характеристики LocalStorage и SessionStorage:
- данные хранятся в виде пар «ключ-значение»;
- хранить можно только строки;
- если вам необходимо хранить в этих хранилищах массивы и объекты, то сначала вы должны их превратить в строки, например, используя метод . Для преобразования строки обратно в массив или объект, можно использовать . Подробнее об этом позже.