localStorage と JSON

localStorage はブラウザにデータを永続的に保存できる機能です。ただし、文字列しか保存できないため、オブジェクトや配列を扱う際には JSON との組み合わせが必須になります。

localStorage の基本

localStorage は key-value 形式でデータを保存します。ブラウザを閉じてもデータは残り、明示的に削除するまで保持されます。

// 保存
localStorage.setItem("username", "田中");

// 取得
const name = localStorage.getItem("username");
console.log(name); // "田中"

// 削除
localStorage.removeItem("username");

// 全削除
localStorage.clear();

オブジェクトの保存

localStorage は文字列しか保存できないため、オブジェクトをそのまま保存すると [object Object] になってしまいます。

const user = { name: "田中", age: 25 };

// 間違った方法
localStorage.setItem("user", user);
console.log(localStorage.getItem("user")); // "[object Object]"

// 正しい方法
localStorage.setItem("user", JSON.stringify(user));
console.log(localStorage.getItem("user")); // '{"name":"田中","age":25}'

オブジェクトの取得

保存した JSON 文字列は JSON.parse() でオブジェクトに戻します。

const saved = localStorage.getItem("user");
const user = JSON.parse(saved);

console.log(user.name); // "田中"

オブジェクトを JSON.stringify() で文字列に変換

localStorage.setItem() で保存

localStorage.getItem() で取得

JSON.parse() でオブジェクトに復元

存在確認とデフォルト値

データが存在しない場合、getItem() は null を返します。JSON.parse(null) は null を返すため、デフォルト値の設定が必要です。

function loadData(key, defaultValue) {
  const saved = localStorage.getItem(key);
  if (saved === null) {
    return defaultValue;
  }
  return JSON.parse(saved);
}

const settings = loadData("settings", { theme: "light", fontSize: 14 });

配列の保存

配列もオブジェクトと同様に JSON 変換して保存します。

const todos = [
  { id: 1, text: "買い物", done: false },
  { id: 2, text: "掃除", done: true }
];

localStorage.setItem("todos", JSON.stringify(todos));

// 取得
const savedTodos = JSON.parse(localStorage.getItem("todos"));
console.log(savedTodos[0].text); // "買い物"

便利なラッパー関数

JSON 変換を毎回書くのは面倒なので、ラッパー関数を作っておくと便利です。

const storage = {
  get(key, defaultValue = null) {
    try {
      const item = localStorage.getItem(key);
      return item ? JSON.parse(item) : defaultValue;
    } catch {
      return defaultValue;
    }
  },
  
  set(key, value) {
    localStorage.setItem(key, JSON.stringify(value));
  },
  
  remove(key) {
    localStorage.removeItem(key);
  }
};

// 使用例
storage.set("user", { name: "田中", age: 25 });
const user = storage.get("user");

注意点

保存できないデータ

関数、undefined、Symbol、Date(文字列になる)などは正しく保存・復元できません。

容量制限

ブラウザによって異なりますが、通常 5MB 程度の制限があります。

// Date の問題
const data = { created: new Date() };
localStorage.setItem("data", JSON.stringify(data));

const restored = JSON.parse(localStorage.getItem("data"));
console.log(typeof restored.created); // "string"(Date ではない)

// Date として使いたい場合は手動で変換
restored.created = new Date(restored.created);

localStorage と JSON を組み合わせることで、ユーザー設定やアプリケーションの状態を簡単に永続化できます。