概要: このチュートリアルでは、Storage
型と、永続的なデータを保存するためにJavaScriptのlocalStorage
を使用する方法について学習します。
Storage型の概要
Storage
型は、名前と値のペアを保存するように設計されています。Storage
型は、以下の追加メソッドを持つObject
です。
setItem(name, value)
– 名前に対する値を設定します。removeItem(name)
– nameで識別される名前と値のペアを削除します。getItem(name)
– 指定された名前の値を取得します。key(index)
– 指定された数値の位置にある値の名前を取得します。clear()
– すべての値を削除します。
Storage
オブジェクト内の名前と値のペアの数を取得するには、length
プロパティを使用できます。
Storage
オブジェクトは文字列のみを保存できます。文字列以外のデータは、保存前に自動的に文字列に変換されます。
Storage
オブジェクトからデータを取得するときは、常に文字列データが取得されます。
JavaScript localStorageオブジェクト
HTML5仕様では、localStorage
を、Webブラウザに有効期限のないデータを保存する方法として導入しています。
言い換えると、ブラウザに保存されたデータは、ブラウザウィンドウを閉じた後も保持されます。
localStorage
に保存されたデータは、オリジンにバインドされています。つまり、localStorage
はprotocol://host:port
ごとに一意です。
localStorageとCookieの比較
まず、localStorage
に保存されたデータは、Cookieのように、すべてのリクエストでサーバーに送信されません。このため、localStorage
にはより多くのデータを保存できます。
最新のWebブラウザのほとんどでは、localStorage
に最大5MBのデータを保存できます。Cookieには最大4KBを保存できることに注意してください。
次に、localStorage
に保存されたデータは、クライアント、具体的にはWebブラウザ内のJavaScriptによって管理できます。サーバーからアクセスすることはできません。
ただし、Cookieは、Webブラウザとサーバーの両方のJavaScriptによって管理できます。
localStorageへのアクセス
localStorage
には、window
オブジェクトのプロパティを介してアクセスできます。
window.localStorage
Code language: JavaScript (javascript)
localStorage
はStorage
型のインスタンスであるため、Storage
型のメソッドを使用してデータを管理できます。
コンソールで次のコードを入力すると
window.localStorage
Code language: JavaScript (javascript)
…次のオブジェクトが表示されます。
Storage {length: 0}
Code language: CSS (css)
1) setItem()メソッド
次は、setItem()
メソッドを使用して、名前と値のペアをlocalStorage
に保存する方法です。
window.localStorage.setItem('theme','dark');
Code language: JavaScript (javascript)
2) lengthプロパティ
名前と値のペアの数を取得するには、次のようにlength
プロパティを使用します。
console.log(window.localStorage.length); // 1
Code language: JavaScript (javascript)
window
オブジェクトはグローバルなので、明示的に指定する必要はありません。たとえば
console.log(localStorage.length); // 1
Code language: JavaScript (javascript)
3) getItem()メソッド
キーで値を取得するには、getItem()
メソッドを使用します。次の例では、getItem()
メソッドを使用してtheme
キーの値を取得しています。
localStorage.getItem('theme'); // 'dark'
Code language: JavaScript (javascript)
4) removeItem()メソッド
キーで名前と値のペアを削除するには、removeItem()
メソッドを使用します。たとえば
localStorage.removeItem('theme');
Code language: JavaScript (javascript)
5) localStorageオブジェクトのキーをループする
次は、3つの名前と値のペアをlocalStorage
に保存する方法です。
localStorage.setItem('theme','light');
localStorage.setItem('backgroundColor','white');
localStorage.setItem('color','#111');
Code language: JavaScript (javascript)
localStorage
に保存されている名前と値のペアを反復処理するには、Object.keys()
メソッドとfor...of
ループを使用します。
let keys = Object.keys(localStorage);
for(let key of keys) {
console.log(`${key}: ${localStorage.getItem(key)}`);
}
Code language: JavaScript (javascript)
出力
color: #111
theme: light
backgroundColor: white
Code language: HTTP (http)
オブジェクトの保存
Storage
型は文字列データのみを保存します。オブジェクトを保存するには、JSON.stringify()
メソッドを使用して文字列に変換する必要があります。たとえば
const settings = {
backgroundColor: '#fff',
color: '#111',
theme: 'light'
};
localStorage.setItem('settings', JSON.stringify(settings));
console.log(localStorage.getItem('settings'));
Code language: JavaScript (javascript)
出力:(文字列)
'{"backgroundColor":"#fff","color":"#111","theme":"light"}'
Code language: JavaScript (javascript)
次は、localStorage
から値を取得し、JSON.parse()
メソッドを使用してオブジェクトに戻す方法です。
let storedSettings = JSON.parse(localStorage.getItem('settings'));
console.log(storedSettings);
Code language: JavaScript (javascript)
storageイベント
Storage
オブジェクトに変更を加えると、ドキュメントでstorage
イベントが発生します。
storage
イベントは、次のシナリオで発生します。
setItem()
メソッドを呼び出して、名前と値のペアを保存します。removeItem()
メソッドを呼び出して、名前と値のペアを削除します。- そして、
clear()
メソッドを呼び出してすべての値を削除します。
storage
イベントには、次のプロパティがあります。
domain
– ストレージが変更されたドメイン。key
– 設定または削除されたキー。newValue
– キーが設定された値、またはキーが削除された場合はnull
。oldValue
– キーが設定または削除される前の値。
storage
イベントをリッスンするには、次のようにwindow
オブジェクトのaddEventListener()
メソッドを使用します。
addEventListener('storage', function(e){
console.log(`The value of the ${e.key} changed for the ${e.domain}.`);
});
Code language: JavaScript (javascript)
まとめ
Storage
型は、Webブラウザでデータを保存および管理するためのメソッドを提供します。localStorage
は、Webブラウザに永続的なデータを保存できるようにするStorage
型のインスタンスです。localStorage
は文字列のみを保存できます。オブジェクトを保存するには、JSON.stringify()
メソッドを使用して文字列に変換します。そして、JSON.parse()
メソッドを使用して、localStorage
から取得したときに文字列をオブジェクトに変換します。