Set
結(jié)構(gòu)類似數(shù)組,但是沒有重復(fù)的值
Set 的遍歷順序是插入順序
沒有字面量表達(dá)式,只能通過 new Set() 構(gòu)造,并通過 add 方法添加項(xiàng)目:
const s = new Set();
[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));
可以接受有 Iterator 接口的對象作為參數(shù)進(jìn)行初始化:
const set = new Set([1, 2, 3, 4, 4]);
[...set] // [1, 2, 3, 4]
實(shí)例屬性和方法:
size() 返回成員數(shù)量
add(value) 添加成員
delete(value) 刪除成員
has(value) 檢查是否是Set的成員
clear() 清除所有成員
keys():返回鍵名的遍歷器
values():返回鍵值的遍歷器
entries():返回鍵值對的遍歷器
forEach():使用回調(diào)函數(shù)遍歷每個(gè)成員
for...of
let set = new Set(['red', 'green', 'blue']);
for (let item of set.entries()) {
console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]
Set 的很多操作可以先轉(zhuǎn)成數(shù)組去做,然后再轉(zhuǎn)回Set
let set = new Set([1, 2, 3]);
set = new Set([...set].map(x => x * 2));
// 返回Set結(jié)構(gòu):{2, 4, 6}
Map
Map 和對象的區(qū)別在于可以使用各種類型的值作為 key;使用對象作為 key,可以避免同名屬性沖突的問題
Map 的遍歷順序是插入順序
const m = new Map();
const o = {p: 'Hello World'};
m.set(o, 'content')
m.get(o) // "content"
m.has(o) // true
m.delete(o) // true
m.has(o) // false
作為構(gòu)造函數(shù),Map 可以接受數(shù)組作為參數(shù):
const map = new Map([
['name', '張三'],
['title', 'Author']
]);
map.size // 2
map.has('name') // true
map.get('name') // "張三"
任何具有 Iterator 接口、且每個(gè)成員都是一個(gè)雙元素的數(shù)組的數(shù)據(jù)結(jié)構(gòu)都可以當(dāng)作 Map 構(gòu)造函數(shù)的參數(shù)
實(shí)例屬性和方法:
size() 返回成員總數(shù)
set(key, value) 更新鍵值,返回 map
get(key)
has(key) 返回布爾值
delete(key) 返回布爾值
clear() 清除所有成員,沒有返回值
keys():返回鍵名的遍歷器
values():返回鍵值的遍歷器
entries():返回鍵值對的遍歷器
forEach():使用回調(diào)函數(shù)遍歷每個(gè)成員
for...of
Map 的很多操作可以先轉(zhuǎn)成數(shù)組去做,然后再轉(zhuǎn)回Map
const map1 = new Map(
[...map0].filter(([k, v]) => k < 3)
);
WeakSet 和 WeakMap
WeakSet 的成員只能是對象,WeakSet 中的對象都是弱引用,即垃圾回收機(jī)制不考慮 WeakSet 對該對象的引用
WeakMap 只接受對象作為key,且 key 指向的對象不計(jì)入垃圾回收機(jī)制