不可變資料之Immutable

2021-10-09 10:48:57 字數 2942 閱讀 8100

var a = 

a.qty = 10;

可能有小夥伴說,可以用const啊,const對基本資料型別還行,但對引用資料型別根本沒轍,如

const a = 

a.qty = 10;

​ a.qty;// 10

如果把物件a賦值給其它變數還會導致新的問題,如:

const a = 

const b = a;

​ a.qty = 10;

​ b.qty;//10

這時你會發現,修改了a,b的值也跟著改了,這其實是js採用引用賦值的方式來實現資料共享的,好處就是節省記憶體,但缺點也顯而易見,稍微不注意就會導致改a壞b的棘手問題,在複雜的專案中,這種問題還不易排查,有諸多安全隱患。

之前的做法是,利用深拷貝的方式來解決這個問題,雖然問題解決了,但又會引發新的問題:浪費記憶體,還有對一些需要頻繁更新資料又有高效能要求的場景(如:react),深拷貝實則為乙個不明智的操作,於是,imutable.js的出現就是要解決這些開發痛點的。

immutable.js由facebook 工程師 lee byron 花費 3 年時間打造,在js中的引用賦值可以節省記憶體,但隨著應用的不斷複雜後,狀態的改變往往會變成噩夢,通常的做法是複製資料來避免被修改,但這樣又造成了cpu和記憶體的消耗,而immutable利用結構共享可以很好地解決這些問題。

immutable data是一旦建立,就不能再被更改的資料。對 immutable 物件的任何修改或新增刪除操作都會返回乙個新的 immutable 物件。immutable 實現的原理是 persistent data structure(持久化資料結構),也就是對於不需要改變的資料採用結構共享的方式,如下圖

正如你看到的,immutable.js的資料型別有很多,本文主要介紹比較常用的listmap,對應於js中的陣列和物件。

可通過fromjs()tojs()兩個方式實現js和immuatble資料的轉換,如:

import immutable from 'immutable';

const goods =

​ // js -> immutable data

const imdata = immutable.fromjs(goods)

​ // immutable data -> js

imdata.tojs()

fromjs()tojs()會深度轉換資料,隨之帶來的開銷較大,盡可能避免使用,單層資料轉換應直接使用map()list()進行轉換。另外,還可以直接通過json.stringify()對immutable資料轉換也json字串。

import  from 'immutable';

​ const initstate = map(),

managemenustatus:false

})

獲取immutable中的值:get(key)/getin(keys)

map 和 list的通用方法,實現如下
import  from 'immutable';

let state = map(),

})​ // 獲取 version

state.get('version');// 2.0

​ // 獲取username

state.getin(['user','username']);// laoxie

​ // 獲取hobby屬性資料

state.getin(['user','hobby',1]) // 電影

注意: 和傳統的js不同,getin()獲取深層深套物件的值時不需要做每一層級的判斷是否存在,如不存在則會返回undefined(js中如果不判空會報錯)
import  from 'immutable';

let state = map(),

})state.set('version','3.0');

state.get('version');//state不被修改,所以還是返回2.0

​ // 正確的修改方式:修改後重新賦值

state = state.setin(['user','age'],20);

state.getin(['user','age']);//20

​ // update,delete操作同上

if(state.hasin(['user','id']))else
const ima = map(

})const imb = map(

})const newimdata = ima.merge(imb);

console.log(newimdata.tojs());

//輸出 :

// // }

const newimdata = ima.mergedeep(imb);

//輸出 :

// // }

當然immutable的方法還有很多,本文本只涉及到一引起基本操作,如果想要了解跟多資料型別的操作,請自行檢視官

python之可變資料型別與不可變資料型別

可變資料型別與不可變資料型別的區別 當不同的兩個變數賦值相同時,變數位址不相同的為可變資料型別,反之為不可變資料型別 不可變資料型別有哪些 number 數字 string 字串 tuple 元組 可變資料型別有哪些 set 集合 list 列表 dictionary 字典 使用 is 運算子判斷資...

python之可變和不可變資料型別

定義 可變型別定義 變數值改變但是變數位址不會改變 set 集合 list 列表 dictionary 字典 不可變型別定義 變數值改變,變數位址必須改變 number 數值 string 字串 tuple 元組 舉例說明 可變型別舉例 如下 list1 1,2,3,4,5 print id lis...

python 可變資料型別 不可變資料型別

在python中,資料型別分為可變資料型別和不可變資料型別,不可變資料型別包括string,int,float,tuple,可變資料型別包括list,dict。所謂的可變與不可變,舉例如下 a test print a 0 t a 0 1 traceback most recent call las...