簡體   English   中英

ImmutableJS Map()和fromJS()有什么區別?

[英]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}}

這違反了不變性原則。

原因是像ListMap這樣的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如何使嵌套成員不可變。

我希望你理解MapfromJS之間的區別。 一切順利=)

fromJS做了很深的轉換。 也就是說,它將通過所有鍵遞歸並將所有元素轉換為列表,地圖等。

在第二個示例中, address是一個普通對象,而不是ImmutableJS對象,因此您不能使用setIn來更改其值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM