Set, Map, WeakSet和WeakMap这四种类型于ES6新增

Set和Map,类似于数组和对象

Set

集合由一组无序且唯一(即不重复)的项组成,相当于一个既没有重复元素,也没有顺序概念的数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
let set:Set<number> = new Set([1,1,4,5,1,4,1,9,1,9,8,1,0])
// Set具有天然去重的能力(但是不给引用类型去重)
console.log(set) // ->Set(6) { 1, 4, 5, 9, 8, 0 }

// 返回字典所包含的元素个数
console.log(set.size) // ->6

// 添加某个值,返回Set本身
console.log(set.add(3)) // ->Set(7) { 1, 4, 5, 9, 8, 0, 3 }
console.log(set) // ->Set(7) { 1, 4, 5, 9, 8, 0, 3 }

// 返回一个布尔值,表示该值是否为Set的成员
console.log(set.has(1)) // ->true

// 删除某个值,返回一个布尔值,表示删除是否成功
console.log(set.delete(0)) // ->true
console.log(set) // ->Set(6) { 1, 4, 5, 9, 8, 3 }

// 清除所有成员,无返回值
set.clear()
console.log(set) // ->Set(0) {}

// Set还支持很多遍历方法

Map

1
2
3
4
5
6
7
8
// 和对象的区别:Map的key可以是引用类型
// 如果需要键值对数据结构,Map比对象更合适
let map:Map<object,any> = new Map()
map.set({},"yjsp")
map.set([],114)
map.set(()=>{},514)

// Map的方法和Set基本一致

WeakSet和WeakMap

weakSet和weakMap的键都是弱引用,不会被计入垃圾回收

当键的引用数量为0时,就预示着它会被释放

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let obj:any = {name:'yajue'}  // 引用数:1
let jbo:any = obj // 引用数:2

// WeakMap的key只能是引用类型
let wmap:WeakMap<object,string> = new WeakMap()
wmap.set(obj,"yjsp") // 引用数:2 WeakSet和WeakMap的键不计引用数

obj = null // 引用数:1
jbo = null // 引用数:0

// 结果,WeakMap里没有这项了
// 在浏览器环境(V8 GC)中,垃圾回收需要一定时间(最少200ms)
// 所以WeakSet和WeakMap无法取单个值或遍历,因为不稳定
setTimeout(()=>{
console.log(wmap)
},500)