原諒極其簡單的例子,但我想知道是什麼樣的區別以下兩種方法,當你需要使用的OBJ的價值,而無需修改使用immutablejs或任何其他類似libraires它的深層嵌套屬性:部分不變性是一種好的做法嗎?
//case1
var imm_a = {'names':['Joe', 'Jack'], 'owns':{'car': ['Toyota','Ferrari']}};
var a = Immutable.fromJS(imm_a);
a = a.setIn(['owns','car', 0], 'Ford');
//...a bunch of other modifications using immutable.js methods
console.log(a.toJS()); // using the changed value
console.log(imm_a); // imm_a has not changed
//case2
var imm_b = {'names':['Joe', 'Jack'], 'owns':{'car': ['Toyota','Ferrari']}};
var b = Immutable.fromJS(imm_b);
b = b.toJS();
b.owns.car[0] = 'Ford';
//...a bunch of other modifications using native javascript methods
console.log(b); // using the changed value
console.log(imm_b); // imm_b has not changed
在上述兩種情況下,我們都有一個對象(imm_a和imm_b),它們帶有深度嵌套的道具,我們不想改變,但我們需要使用它們的修改值。在情況1中,我們創建了Immutable obj並使用Immutable.js方法直接修改它,在第二種情況下,我們創建了一個Immutable對象後,我們創建了一個本地JavaScript變量,以便我們可以使用直接分配和其他本地JavaScript方法。在這兩種方法中,我們都達到了保持Imm_a和imm_b不變的目標,但我發現第二種方法對於簡單修改更容易。但是有什麼區別嗎?推薦哪一種作爲更好的做法? PS:在這兩種情況下,我都在乎不變的b
或a
,我只需要imm_a
和imm_b
保持不變。一個常見的用例是一個Redux應用程序,其中新狀態依賴於舊狀態,並且在將其作爲新狀態返回之前需要修改舊狀態值。這裏是a
和b
是本地臨時變量。問題是,只要我不依賴持久性值就可以直接修改它們嗎?或者,如果我使用不可變的做法,我需要把一切都視爲不可變的?
我知道'b'在這裏改變,但'a'就是我所關心的。想象一下,在整個應用程序執行過程中,一些對象需要保持不變,但其他一些對象可以改變。一個例子可能是國家在React/Redux應用程序中,一個深度嵌套的新狀態依賴於舊狀態。在這種情況下,爲什麼我不能創建一個可變的本地值'b'來保存只需要返回一個新狀態而不需要修改舊值的值。爲什麼我應該在這裏使用immutablejs方法,而不是僅僅使用這些值呢? –
再一次,如果你不寫不可變的代碼,你可能不需要immutablejs。保持一切不變的一致性,風格和理解是爲什麼你會選擇第一個。 –