按照官網的定義, Immutable Data是指一旦被創造後,就不能夠被改變的數據。javascript
JavaScript提供三種不一樣的值比較操做:java
三者區別以下:react
那麼,javascript是怎麼對兩個對象進行比較的呢?git
var person1 = { age: 27, gender: "male", education: {major:"math",school:"Harvard"} }; var person2 = { age: 27, gender: "male", education: {major:"math",school:"Harvard"} }; console.log(person1 == person2); //false console.log(person1 === person2); //false console.log(Object.is(person1,person2)); //false
雖然,person1和person2的屬性是徹底同樣的,可是person1和person2相等性判斷爲false。由於對象是經過指針指向的內存中的地址來比較的。github
不少場景下,對於屬性相同的對象,咱們但願相等性判斷爲true。Underscore.js和Lodash都有一個名爲_.isEqual()方法,用來處理深度對象的比較。大體思路是遞歸查找對象的屬性進行值比較(具體實現推薦這篇文章:https://github.com/hanzichi/u...)。固然了,對象層級越深,比較越耗時。性能優化
相比之下,immutable.js
使用了 Structural Sharing(結構共享),特別擅長處理對象的比較,性能很是好。上面的代碼,讓咱們換成immutable.js
來表達:ide
const person1 = Immutable.Map( { age: 27, gender: "male", education: Immutable.Map({ major:"math", school:"Harvard" }) }); const person2 = Immutable.Map( { age: 27, gender: "male", education: Immutable.Map({ major:"math", school:"Harvard" }) }); const person3 = person1.setIn(["education","major"], "english"); //person3專業爲english console.log(Immutable.is(person1, person2));//true console.log(Immutable.is(person1, person3));//false
恩,達到了咱們想要的效果。性能
衆所周知,react性能優化的核心在於處理shouldComponentUpdate
方法來避免沒必要要的渲染。雖然react提供了PureComponent,但它實質只是淺比較,沒法很好地處理對象的比較,因此仍是不能解決重複渲染的問題。優化
這個時候,immutable.js
應運而生,它能夠完美地解決這個問題,極大地提升react應用的性能。spa