最近Immutable.jsを導入してウキウキしていました。特にJavaScriptはオブジェクトが基本的に参照渡しなので、意識していないと変なところで値が変わることがあったので大変価値があるライブラリでした。
ところがオブジェクトの値が変なところで書き換わっていることに気がつきました。
以下のようなケースです。
var objects = [
{
id: 1,
name: 'Jack',
city: 'New York'
},
{
id: 2,
name: 'Tom',
city: 'Berkeley'
}
];
var modified = Immutable.Seq(objects)
.map(object => {
object.name = object.name.toUpperCase();
return object;
}).toArray();
元のオブジェクトは以下のように書き換わります。
[
{
id: 1,
name: 'JACK',
city: 'New York'
},
{
id: 1,
name: 'TOM',
city: 'Berkeley'
}
]
途中の高階関数で与えられる引数は元の参照を持っていることがわかりました。