Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

Immutable.jsの個人的な備忘録

(この記事はQiitaで僕が書いたものを移行した記事です。記事中のコメントはQiitaの該当記事を参照ください)

immutable.jsを学んでいるので、忘れないように備忘録をつける…というのは建前で本音はQiita投稿デビューしたかったんです。

immutable.jsのすごいところ

list=Immutable.List.of(1,1,2,3) とすると、そのリストが(変数がとは言ってない)変更できなくなります。つまり list.push(5);list.push(8); としても変化がなくて、listの値は[1,1,2,3]のままです。

ではどうやってpush()を使うのかというと返り値を代入します。

実はpush()の挙動はArray.prototype.push()と違う点がひとつあります。それは返り値が配列だという点です。

つまり list = list.push(5); とすれば[1,1,2,3,5]というイミュータブルな配列が手に入ります。

ではimmutableで何が嬉しいかというと listに再代入しないかぎりlistはいつまでも[1,1,2,3]だと保証してくれる わけです。つまりlistは再代入箇所以外では変更される恐れがないのでlistを監視する部分を大幅に減らすことができます。いや、listがどのように変わるのかもコード読むだけでわかるようになるのでデバッグ時の console.log(list); なんていう汚物が消えます。

pop()も同様に返り値が配列となっています。だから lastItem = list.pop(); という、配列の最後を削除してその要素を返すというプログラムは我々が予期したとおりに動いてくれません。その代わりimmutable.jsは lastItem = list.last(); というより直感的にしたメソッドを提供してくれています。もちろんlast()はlistに変更を加えません。

無限を扱える

immutable.jsでは無限を扱えます。無限長の自然数(と0)の配列だって作れます。ただしメモリは使用しません。なぜかというと、無限長の自然数(と0)の配列だよ〜と言って宣言するだけで その場では評価しない のです。いわゆる遅延評価ですね。そうすることによって、「じゃあこの配列のうち1000個だけ表示したいな」という時にようやく無限のうち1000個が計算されて表示されるのです。 無限長の自然数(略)の配列は Immutable.Range() で作れます。 (続くかも)