愛と勇気と缶ビール

ふしぎとぼくらはなにをしたらよいか

localStorageとかsessionStorageとかのアレ

現状のlocalStorageとかsessionStorageは、valueとして文字列しかsetできない実装ばかりなので、アプリで使うならsetする時にJSON.stringifyして、getする時にJSON.parseするようなラッパーを書かないと無理とまでは言わないがめんどくさい。

また、

localStorage.key = "hoge";
localStorage[key] = "hoge";
localStorage.setItem(key, "hoge");

は、一応目的としては同じなのだが、setItemやgetItemはどうやらブラウザごとに挙動が微妙に異なるみたい。

例えば、手元のFirefox4.0.1では、setItem(null, "foo"); を実行してもnullをキーとして"foo"がsetされることはないが、setItem(undefined, "foo"); を実行するとundefinedをkeyとして、"foo"というvalueが格納されてしまう。

一方手元のChrome 11.0.696.14 devのlocalStorage.setItemは、nullもundefinedもkeyとしておいしく頂いてしまうようだ。

こういったsetItemやらgetItemの挙動に依存するコードを書いてはいけない。

また、

localStorage.setItem({}, "obj");

を実行すると、"[object Object]"という文字列をkeyとして、"obj"がvalueとして保存される。

これはFirefoxでもChromeでもtoStringを見ているようなので

function Hoge() {
}
Hoge.prototype.toString = function() { return "[homuhomu]"; };

var o = new Hoge();

localStorage.setItem(o, "obj");

とかすると、めでたく"[homuhomu]"をkeyとして"obj"が保存されることになる。


null, undefined, オブジェクトのいずれについてもユーザ側が期待するような動作ではないので、ラッパーでチェックして数字と文字列以外をkeyとして渡そうとしたらハネちゃった方がいい、とオモワレル(この辺のポリシーはどう決めるかの問題だけど)。