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ù)組的map和filter方法也可以間接用于Set。
2. WeakSet
與Set的2個區(qū)別:
- WeakSet的成員只能是對象(
null也不行),而不能是其他類型的值。- 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本身沒有map和filter方法)
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ū)別:
- WeakMap只接受對象作為鍵名(
null也不行),不接受其他類型的值作為鍵名。- 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 }
(完)