、ここ
var a = {address: {postcode: 5085}}
var d = Immutable.Map(a);
、d.get('address')
は不変あります。値は他のオブジェクトに変更できません。 ImmutableJSのImmutable.Map.set()
関数を使用して既存のオブジェクトからのみ新しいオブジェクトを作成することができます。
しかし、d.get('address')
すなわちによって参照オブジェクト、{postcode:5085}
は、標準のJavaScriptオブジェクトです。変更可能ですです。あなたは再びdの値をチェックすると、あなたは彼値が変更されていることがわかります
d.get('address').postcode=6000;
:このような文はpostcode
の値を変更することができます。
console.log(JSON.stringify(d)); //Outputs {"address":{"postcode":6000}}
これは不変性の原則に反する。
理由はList
とMap
などのImmutableJSデータ構造がList
/Map
のレベルのみ-1メンバーへの不変性機能を付与することがあります。
オブジェクト内に配列または配列内のオブジェクトがあり、それらも変更不能にしたい場合は、Immutable.fromJS
です。
var a = {address: {postcode: 5085}}
var b = Immutable.fromJS(a);
b.get('address').postcode=6000;
console.log(JSON.stringify(b)); //Outputs {"address":{"postcode":5085}}
上記の例から、あなたは明らかにfromJS
は、ネストされたメンバーは不変なりますどのように知ることができます。
Map
とfromJS
の違いを理解していただければ幸いです。すべて最高=)
omg、これを説明してくれてありがとう!私はこれに苦しんできました。そして、私はmap.get(k)が参照によって戻ってきた理由を理解しています(そして、なんらかの愚かなdeepCopy(map.get(k))をしないで避ける方法) – grendian
Immutable.jsマップドキュメントはfromJSとのこのコアの違いを明確にしていません:https://facebook.github.io/immutable-js/docs/#/Map –