2016-10-05 100 views
-1

原諒極其簡單的例子,但我想知道是什麼樣的區別以下兩種方法,當你需要使用的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:在這兩種情況下,我都在乎不變的ba,我只需要imm_aimm_b保持不變。一個常見的用例是一個Redux應用程序,其中新狀態依賴於舊狀態,並且在將其作爲新狀態返回之前需要修改舊狀態值。這裏是ab是本地臨時變量。問題是,只要我不依賴持久性值就可以直接修改它們嗎?或者,如果我使用不可變的做法,我需要把一切都視爲不可變的?

回答

1

第二個示例完全違背了使用ImmutableJS的目的,因爲您要改變Javascript對象的b的內容。 ImmutableJS的一個要點是如果你修改一個對象,你會得到一個全新的對象。

在這個簡單的例子中,它不會產生任何效果,但是編寫不可變代碼的好處是任何其他參考a的人都知道它永遠不會改變,並且在得到它之後它會始終具有相同的值。在你的第二個例子中,因爲你修改了b,可以這麼說,因爲你的本地更新也會發生在他們對該對象的引用上,所以任何其他代碼都會引用b

如果您不使用ImmutableJS來確保實際的不變性,那麼您最好暫時不使用它。它爲程序增加了不重要的開銷工作。

+0

我知道'b'在這裏改變,但'a'就是我所關心的。想象一下,在整個應用程序執行過程中,一些對象需要保持不變,但其他一些對象可以改變。一個例子可能是國家在React/Redux應用程序中,一個深度嵌套的新狀態依賴於舊狀態。在這種情況下,爲什麼我不能創建一個可變的本地值'b'來保存只需要返回一個新狀態而不需要修改舊值的值。爲什麼我應該在這裏使用immutablejs方法,而不是僅僅使用這些值呢? –

+0

再一次,如果你不寫不可變的代碼,你可能不需要immutablejs。保持一切不變的一致性,風格和理解是爲什麼你會選擇第一個。 –

相關問題