[英]What is the difference between ImmutableJS Map() and fromJS()?
var a = {address: {postcode: 5085}}
var b = Immutable.fromJS(a)
var c = b.setIn(['address', 'suburb'], 'broadview').toJS(); // no error
console.log(c);
var d = Immutable.Map(a);
var e = d.setIn(['address', 'suburb'], 'broadview').toJS(); // error invalid keyPath(…)
有人可以解釋這個區別。
謝謝,
在這個例子中,
var a = {address: {postcode: 5085}}
var d = Immutable.Map(a);
這里, d.get('address')
是不可變的 。 它的值不能改變為任何其他對象。 我們只能使用Immutable.Map.set()
函數從現有對象創建一個新Object。
但是, d.get('address')
引用的對象,即{postcode:5085}
是一個標准的JavaScript對象。 這是可變的 。 像這樣的聲明可以改變postcode
的價值:
d.get('address').postcode=6000;
如果再次檢查d的值,則可以看到他的值已更改。
console.log(JSON.stringify(d)); //Outputs {"address":{"postcode":6000}}
這違反了不變性原則。
原因是像List
和Map
這樣的ImmutableJS數據結構只賦予List
/ Map
的level-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
之間的區別。 一切順利=)
fromJS
做了很深的轉換。 也就是說,它將通過所有鍵遞歸並將所有元素轉換為列表,地圖等。
在第二個示例中, address
是一個普通對象,而不是ImmutableJS對象,因此您不能使用setIn
來更改其值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.