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