在 ES6 中,模塊系統的導入與導出采用的是引用導出與導入(非簡單數據類型),也就是說,如果在一個模塊中定義了一個對象并導出,在其他模塊中導入使用時,導入的其實是一個變量引用,如果修改了對象中的屬性,會影響到其他模塊的使用。
通常情況下,系統體量不大時,我們可以使用 JSON.parse(JSON.stringify(str)) 簡單粗暴地來生成一個全新的深度拷貝的 數據對象。不過當組件較多、數據對象復用程度較高時,很明顯會產生性能問題,這時我們可以考慮使用 Immutable.js。
缺點:
主要是Immutable的API設計的和原生對象類似,容易混淆操作。例如其中Map和List的操作:
// Immutable const map = Map({ a: 1, b: 2 }); const list = List([1,2,3]);
// 原生js
const obj = { a: 1, b: 2 };
const arry = [1,2,3];
// 取值方式對比
console.log(map.get('a'));
console.log(list.get(0));
console.log(obj.a);
console.log(arry[0]);
優點:
節省內存空間
上面提到了結構共享,Immutable.js 使用這種方式會盡量復用內存,甚至以前使用的對象也可以再次被復用。沒有被引用的對象會被垃圾回收。
import { Map } from 'immutable';
let a = Map({
select: 'users',
filter: Map({ name: 'Cam' })
})
let b = a.set('select', 'people');
a === b; // false
a.get('filter') === b.get('filter'); // true
浙公網安備 33010602011771號