【Set和Map数据结构】
1.Set
它类似于数组,但是成员的值都是唯一的,没有重复的值
const set = new Set([1, 2, 2, 3, 4, 4]);
[...set] // [1, 2, 3, 4]
set.size // 4
const set1 = new Set()
set1.add('a')
set1.add('b')
set1.add('b')
[...set1] // ['a', 'b']
- size属性:返回Set实例的成员总数。
Set4个操作方法:
- Set.prototype.add(value):添加某个值,返回 Set 结构本身。
- Set.prototype.delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
- Set.prototype.has(value):返回一个布尔值,表示该值是否为Set的成员。
- Set.prototype.clear():清除所有成员,没有返回值。
Set4个遍历方法:
- Set.prototype.keys():返回键名的遍历器
- Set.prototype.values():返回键值的遍历器
- Set.prototype.entries():返回键值对的遍历器
- Set.prototype.forEach():使用回调函数遍历每个成员
作用:
- 去除数组中重复成员
const arr1 = [1, 2, 2, 3, 4, 5, 5, 6]
[...new Set(arr1)] // [1, 2, 3, 4, 5, 6]
- 去除字符串里面的重复字符
[...new Set('ababbc')].join('') // "abc"
WeakSet
Set和WeakSet的区别:
- WeakSet 只能储存对象引用,不能存放值,而 Set 对象都可以
- WeakSet 对象中储存的对象值都是被弱引用的,即垃圾回收机制不考虑 WeakSet 对该对象的引用,如果没有其他的变量或属性引用这个对象值,则这个对象将会被垃圾回收掉
WeakSet方法:
- add(value):在WeakSet 对象中添加一个元素value。
- has(value):判断 WeakSet 对象中是否包含value。
- delete(value):删除元素 value。
2.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
- size属性
size属性返回 Map 结构的成员总数
const map = new Map();
map.set('foo', true);
map.set('bar', false);
map.size // 2
- Map.prototype.set(key, value)
set方法设置键名key对应的键值为value,然后返回整个 Map 结构。
如果key已经有值,则键值会被更新,否则就新生成该键。
const m = new Map();
m.set('edition', 6) // 键是字符串
m.set(262, 'standard') // 键是数值
m.set(undefined, 'nah') // 键是 undefined
set可采用链式写法
let map = new Map()
.set(1, 'a')
.set(2, 'b')
.set(3, 'c');
-
Map.prototype.get(key)
get方法读取key对应的键值,如果找不到key,返回undefined。 -
Map.prototype.has(key)
has方法返回一个布尔值,表示某个键是否在当前 Map 对象之中 -
Map.prototype.delete(key)
delete方法删除某个键,返回true。如果删除失败,返回false。 -
Map.prototype.clear()
clear方法清除所有成员,没有返回值
WeakMap
WeakMap 对象是一组键值对的集合,其中的键是弱引用对象,而值可以是任意。 注意,WeakMap 弱引用的只是键名,而不是键值。键值依然是正常引用。