关于Set
Set是什么?
Set是es6新的数据结构,类似数组,是一个构造函数。
Set可以用来做什么?
1.用来数组快速去重
const a_list = [1,2,1,2,2,3,4,5] // 可接收数组参数 const a_set = new Set() console.log(...a_set) // 1 2 3 4 5
const b_list = Array.from(a_set)
console.log(b_list) // 1 2 3 4 5
// 可接收字符串参数 const b_str = 'abcdefgabcdefg' console.log(...new Set(b_str)) // a b c d e f g tips:向Set加入数值不发生类型转换 5跟 '5'一起加入是不会被去重的 NaN === NaN // false 但是Set认为是相等的
2.实例的属性方法
// 增 ---添加值,并返回整个Set实例 a_set.add(2) // 删 --- 删除Set实例成员值,并返回布尔值 a_set.delete(2) // true // 查 --- 查找是Set实例否存在这个值,并返回布尔值 a_set.has(2) // false // 清除全部 ---清除Set实例全部内容,不返回任何值 a_set.clear() // 长度 --- 返回Set实例成员的总数 a_set.size()
// 遍历 --- 遍历键keys、值values、键值对;由于Set数据结构没有键名,只有键值,所以keys/values 遍历的结果都一样
for(let item of a_set.keys()){
console.log(item) // 1 2 3 4 5 6
}
for(let item of a_set.values()){
console.log(item) // 1 2 3 4 5 6
}
for(let item of a_set.entries()){
console.log(item) // [1,1] [2,2] [3,3 [4,4] [5,5] [6,6]
}
tips:Set数据结构的实例默认就是values遍历 所以直接 for(let item of a_set){} 就可以
也可以a_set.forEach(function(value, key, aSet){ console.log(key,value) })
数组的map、filter方法也同样适用a_set
3.Set数据结构跟Array数组互转
// Set转数组 const c_list = Array.from(a_set); //数组转Set const d_set = new Set(c_list)
关于WeakSet
跟Set类似,也是一个不重复值的集合,但与Set有三点不同
1)只能存储对象
2) 其成员的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用,
一旦其他对象不引用该对象,那么垃圾回收机制就会自动回收该对象所占用的内存,不管该对象是否存在于WeakSet中
3)只有add() / delete() / has() 方法,不能遍历
关于Map
es6之前,作为键值对集合的Object的键只能是字符串,即使是不是字符串也将被自动转为字符串
es6的Map的出现解除了这种限制,作为键,可以是任意值
const key = {a: 'a'} const value = [1,2,3,4] const a_map = new Map([) a_map.set(key, value) a_map.get(key) // [1,2,3,4] // 与Set一样有has()、delete()、clear()方法,size属性,且有set()、get()方法 a_map.has(key) // true a_map.deltete(key) // true a_map.has(key) // false // 可接受数组作为参数,且成员一定要是表示键值的双元素小数组 const b_list = [[1, 2], ['key', 'value']] const b_map = new Map(b_list) b_map.get(1) // 2 b_map.get('key') // 'value' const d_set = new Set([1,2],['key', 'value']) const c_map = new Map(d_set) c_map.get('key') // 'value' const d_map = new Map(c_map) d_map.get('key') // 'value' // 如果对同一个键赋值多次,会产生覆盖效果 d_map.set('key', 'value1') d_map.get('key') // 'value1' tips:当用对象作为键,要注意是否是同一个对象 d_map.set({a:'b'},'obj') d_map.get({a:'b'}) // undefined
NaN === NaN false NaN不严格相等于自身 但是Map视为同一个键
// 跟Set一样可以进行遍历 1) d_map.values() // 返回值 2) d_map.keys() // 返回键 3) d_map.entries() // 返回键值 4) d_map.forEach() // 遍历所有成员
// Map集合转为数组 const d1_list = [...d_map.values()] // 所有值组成的数组 const d2_list = [...d_map.keys()] // 所有键组成的数组 const d3_list = [...d_map.entries()] // 所有键值小数组组成的大数组 const d4_list = [...d_map] // 所有键值小数组组成的大数组
关于WeakMap
跟Map一样有set、get方法,跟WeakSet一样只接受对象作为键(null除外),
也是弱引用,会被垃圾回收机制自动回收,也是不能遍历,没有size属性,
注意这里的对象引用只是键的引用不是键值,