素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: twitter: @javascripter にどうぞ。

FirefoxがlocalStorageに対応した

Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2a1pre) Gecko/20090423 Minefield/3.6a1preでは、sessionStorage、localStorage、globalStorageが存在する。
sessionStorageはページのセッション間、つまりリロードしても消えないがページを新規に開いたりした時には消える。
globalStorageとlocalStorageは、ユーザやプログラムが消さない限り、永続的に保存される。
ところで、このglobalStorageに関する説明で、

var localStorage = localStorage || globalStorage[location.hostname];
Firefox 3でlocalStorageを使うには - builder

のようなソースがあるが、使用すべきではない。
トップレベルで実行すると、localStorageが存在する場合にlocalStorage = localStorage;を実行するので、 TypeError: setting a property that has only a getterというエラーになる。また、トップレベルのスコープ以外ではlocalStorageが存在しても、globalStorage[location.host]が代入されてしまう。
なので、最新のブラウザに対応する為には、

if (typeof localStorage != "object" && typeof globalStorage == "object") {
  localStorage = globalStorage[location.host];
}

とすると良い。
ただし、厳密にはlocalStorageとglobalStorageは異なり、

localStorage.hoge = 1;
console.log(localStorage.hoge);

は文字列が出力されるが、

globalStorage[location.host].hoge = 1;
console.log(globalStorage[location.host].hoge);

は、({value: "1", secure: "1"})というオブジェクトが出力される。このオブジェクトには、"1"という文字列を返すtoStringメソッドが実装されているので大抵の場合は問題ないが、文字列型を厳密に要求する場合は、.valueを参照するなどして文字列に変換する必要がある。