Set和Map數(shù)據(jù)結構

參考:《Set和Map數(shù)據(jù)結構》


1. Set

Set中成員的值是唯一的,沒有重復的值??梢杂糜?code>去除數(shù)組重復數(shù)據(jù)。

let set = new Set()
// 在Set內部,兩個NaN是相等的
let a = NaN, b = NaN
set.add(a).add(b)
set.size // 1

// 兩個對象總是不相等的
set.add({})
set.size // 2
set.add({})
set.size // 3

2個實例屬性

  • Set.prototype.constructor:請忽略
  • Set.prototype.size

4個操作方法

  • add(value)
  • delete(value)
  • has(value)
  • clear()

4個遍歷方法

  • keys()
  • values():默認
  • entries():鍵名和鍵值是同一個值,該方法用處不大
  • forEach()

set的遍歷順序就是插入順序。
數(shù)組的mapfilter方法也可以間接用于Set。


2. WeakSet

與Set的2個區(qū)別:

  1. WeakSet的成員只能是對象(null也不行),而不能是其他類型的值。
  2. WeakSet中的對象都是弱引用,即垃圾回收機制不考慮WeakSet對改對象的引用。

3個操作方法

  • add(value)
  • delete(value)
  • has(value)

size屬性,WeakSet不可遍歷。
clear()操作方法,無遍歷操作。

好處:不會出現(xiàn)內存泄露。


3. Map

Object:字符串—值
Map:值—值

屬性

  • size

5個操作方法

  • set(key, value)
  • get(key)
  • has(key)
  • delete(key)
  • clear()

4個遍歷方法

  • keys()
  • values()
  • entries():默認
  • forEach()

Map的遍歷順序就是插入順序,和Set一樣。
結合數(shù)組的map方法、filter方法,可以實現(xiàn)Map的遍歷和過濾(Map本身沒有mapfilter方法)

Map的forEach與數(shù)組的forEach類似,但區(qū)別如下:

// Map的forEach,參數(shù)為value、key、map,注意value在前key在后
map.forEach((value, key, map) => console.log(key, value, map))

// Array的forEach,參數(shù)為item、index
array.forEach((item, index) => console.log(item, index))

4. WeakMap

與Map的2個區(qū)別:

  1. WeakMap只接受對象作為鍵名(null也不行),不接受其他類型的值作為鍵名。
  2. WeakMap的鍵名指向的對象,不計入垃圾回收機制。

4個操作方法

  • get()
  • set()
  • has()
  • delete()

size屬性,WeakMap不可遍歷。
clear()操作方法,無遍歷操作。

注:WeakMap弱引用的只是鍵名,而不是鍵值。鍵值依然是正常引用。

const wm = new WeakMap()
let key = {}
let obj = { foo: 1 }

wm.set(key, obj)
obj = null
wm.get(key) // Object { foo: 1 }

(完)

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容