immutable不可變物件,介紹及詳細用法。

2021-10-09 21:15:07 字數 3215 閱讀 4498

facebook 工程師使用3年時間打造,與react同期出現,但是沒有被預設放到react工具集中,它內部實現了一套完整的資料持久化 裡面有很多常見的資料型別collection list map set等

裡面有三種重要的資料解構

map: 鍵值對集合,對應於object es6中也有專門的map物件

list: 有序可以重複的列表,對應於array

set: 無序並且不可重複key的陣列

immutable 實現的原理是(持久化資料結構),也就是使用舊資料建立新資料時,要保證舊資料同時可用且不變。同時為了避免深拷貝把所有節點都複製一遍帶來的效能損耗,immutable 使用了(結構共享),即如果物件樹中乙個節點發生變化,只修改這個節點和受它影響的父節點,其它節點則進行共享。

immutable介紹

immutable data就是一但建立,就不能在被改變的資料,對於immutabe物件的任何修改或者新增刪除操作都會返回乙個新的immutable物件

map: 鍵值對集合。

1、建立map集合:let xx=map()

2、讀取map集合:get("")

3、修改map集合:set("")

4、刪除map集合:delete("")

5、批量刪除map集:deleteall("")

6、合併集合:merge

7、清除集合:claer()

8、tojs深轉換 語法:***.tojs

9、tojson深轉換

注:新建js檔案複製下面**用node執行即可在控制台檢視執行結果

let =require("immutable")

let a=map()

let c=map()

let b=a //建立乙個新的變數mpa賦值給b

console.log(a===b)//true

//1、獲取方式 變數名.get("***")

console.log(a.get("name"))//guodong

//2、修改

let newobj=a.set("name","lalalal")

console.log(newobj.get("name"))//lalalal

//3、刪除

let newbj=a.delete("name")

console.log(newbj.get("name"))//undefined

console.log(a.get("name"))//guodong

//4、批量刪除

let pil=a.deleteall(["name","age"])

console.log(pil.get("name"))//undefined

//5、清除並返回新的map

let qing=a.clear()

console.log(qing)

//6、合併並且返回新的map

let he=a.merge(c)

console.log(he)//

1、建立list兩種方式:

let =require("immutable")

let arr=list([1,2,3,4,5,6])//[ 1, 2, 3, 4, 5, 6 ]

let listarr=list.of(1,2,3)//[ 1, 2, 3 ]

console.log(listarr)

2、size獲取list長度 set(下標,值)用於設定指定下標的值

let =require("immutable")

let arr=list([1,2,3,4,5,6])

let listarr=list.of(1,2,3)

console.log(arr.set(-1,"guo"))//[ 1, 2, 3, 4, 5, "guo" ]

console.log(listarr.set(1,"haha"))//[ 1, "haha", 3 ]

3、delete(下標)刪除指定下標 insert()用來更新指定下標的值

let =require("immutable")

let arr=list([1,2,3,4,5,6])

let listarr=list.of(1,2,3)

console.log(arr.insert(2,"我被修改了"))//[ 1, 2, "我被修改了", 3, 4, 5, 6 ]

console.log(listarr. delete(1))//[ 1, 3 ]

4、update(下標,回掉函式)用於更新指定下標的值 clear()清空並且返回乙個空list

let =require("immutable")

let arr=list([1,2,3,4,5,6])

let listarr=list.of(1,2,3)

let ua=arr.update(3,()=>"更新了")

let ca=listarr.clear()

console.log(ua)//[ 1, 2, 3, "更新了", 5, 6 ]

console.log(ca)//" "

5、push pop unshift shift 和陣列方法項功能相同 自己嘗試

6、setsize()重新設定陣列長度,小於原始list會被擷取 ,大於會用undefined填充

let =require("immutable")

let arr=list([1,2,3,4,5,6])

let aa=listarr.setsize(3)

console.log(aa)//[ 1, 2, 3 ]

7、concat() 把多個list拼接成乙個list merge()是concat()別名

let =require("immutable")

let lista=list([1,2,3,4,5,6])

let listb=list.of(1,2,3)

let ca=lista.concat(listb)

console.log(ca)//[ 1, 2, 3, 4, 5, 6, 1, 2, 3 ]

let cb=lista.merge(listb)

console.log(cb)//[ 1, 2, 3, 4, 5, 6, 1, 2, 3 ]

不可變資料之Immutable

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 這...

可變物件,不可變物件

不可變物件為字串,元組等 可變物件為列表,字典,集合等。淺拷貝只是對已經存在的記憶體新增加乙個物件引用。深拷貝就是重新申請乙個新的記憶體,使這個是新物件是新記憶體位址的引用。對於可變物件引用時時經常出現。考慮以下兩段 1 l for i in range 10 num i print l 結果 2 ...

可變物件和不可變物件

要理解可變物件和不可變物件,先要理解final關鍵字。參考此部落格 沒有經過原博主的同意便引用了一些,侵刪!final關鍵字可以用來修飾類 方法和變數 成員或區域性 final修飾類時表明這個類不能被繼承。final類中的方法會被隱式的定義為fianl,變數自行定義需要不要被final修飾。fina...