1.immutable為什么要用?
利用這個庫來實現(xiàn)數(shù)據(jù)的表現(xiàn)方式,加強數(shù)據(jù)的不可變性
JavaScript 中的對象一般是可變的(Mutable),因為使用了引用賦值,新的對象簡單的引用了原始對象,改變新的對象將影響到原始對象。如
foo={a: 1};
bar=foo;
bar.a=2
console.log( foo.a )//2
雖然這樣做可以節(jié)約內(nèi)存,但當(dāng)應(yīng)用復(fù)雜后,這就造成了非常大的隱患,簡單的說當(dāng)數(shù)據(jù)結(jié)構(gòu)復(fù)雜,數(shù)量多時,使用immutable,當(dāng)數(shù)據(jù)較少的時候,**一般的做法是使用下面幾種方法實現(xiàn) **
1.1es6-Object.assign()方法
深復(fù)制只有一層,之后為淺復(fù)制(除非嵌套)
var obj = {a:1}
var obj1 = {b:2}
var obj2 =Object.assign(obj,obj1)
console.log(obj2)//{a: 1, b: 2}
1.2使用ES7中的擴(kuò)展運算符
var obj = {a:1}
var obj1 = {b:2}
var obj2=Object.assign(obj,obj1)
//...盡量使用這樣的賦值形式
obj={...obj,a:2}
console.log(obj)//{a: 2, b: 2}
console.log(obj2)//{a: 1, b: 2}
var obj = {a:1}
var obj1 = {b:2}
var obj2=Object.assign(obj,obj1)
//避免使用,這種方法賦值
obj.a=2
console.log(obj)//{a: 2, b: 2}
console.log(obj2)//{a: 2, b: 2}
1.3JQuery的extend
let newObj = $.extend(true,{},partcontent);
2.什么是 Immutable Data
Immutable庫是Facebook公司的一個開源軟件庫。我們使用redux-immutable模塊將這個庫整合進(jìn)我們的程序,這樣我們就能以Immutable庫提供的數(shù)據(jù)類型來存儲程序狀態(tài)(app state)了。
Immutable Data 就是一旦創(chuàng)建,就不能再被更改的數(shù)據(jù)。不可變數(shù)據(jù)是[面向功能編程的核心概念,這種概念在JavaScript中的應(yīng)用已漸占優(yōu)勢。使用React框架和Redux庫時,不可變數(shù)據(jù)能幫助鞏固這兩者的核心原則:如果程序狀態(tài)(app state)沒有發(fā)生改變,那網(wǎng)頁的文檔對象模型(DOM)也不用改變。
Immutable 實現(xiàn)的原理是 Persistent Data Structure(持久化數(shù)據(jù)結(jié)構(gòu)),也就是使用舊數(shù)據(jù)創(chuàng)建新數(shù)據(jù)時,要保證舊數(shù)據(jù)同時可用且不變。同時為了避免 deepCopy 把所有節(jié)點都復(fù)制一遍帶來的性能損耗,Immutable 使用了 Structural Sharing(結(jié)構(gòu)共享),即如果對象樹中一個節(jié)點發(fā)生變化,只修改這個節(jié)點和受它影響的父節(jié)點,其它節(jié)點則進(jìn)行共享。