Map和Set | es6基础
了解一下es的历史吧
Set
set结构类似于数组,成员唯一,没有重复的值,但是对象不被认为是唯一值,但是添加的是同一个对象变量还是属于同一值
const s = new Set([{}, {}])
console.log(s.size); // 2
const a = {
name: 'zhangsan'
}
const s = new Set([a,a])
console.log(s); // Set(1) {{…}}
看一下set有什么属性
实例操作方法
- add:添加值,返回set本身值
a.add(7).add(8).add(8)
- delete:删除值,返回布尔值,判断是否删除成功
a.delete(2)
- has:判断set有没有该成员,返回布尔值
a.has(2)
- clear:清除所有成员,没有返回值
a.clear()
实例遍历操作
-
keys:返回键名遍历器
-
values:返回值遍历器
-
entries:返回键值对遍历器
-
forEach:遍历每一个成员 但是set没有键值,所以用值做键
let k = a.keys(); // SetIterator {1, 2, 3, 4}
let v = a.values(); // SetIterator {1, 2, 3, 4}
let e = a.entries(); // SetIterator {1 => 1, 2 => 2, 3 => 3, 4 => 4}
set的默认遍历器就是values,所以可以直接遍历
const a = new Set([1, 2, 3, 4])
Set.prototype[Symbol.iterator] === Set.prototype.values // true
for(let v of a) {
console.log(v); // 1 2 3 4
}
应用
- 可以使用set做数组去重操作
let array = [1, 3, 3, 3, 5, 6, 7, 7, 7, 7, 8, 8]
array = Array.from(new Set(array))
console.log(array); // (6) [1, 3, 5, 6, 7, 8]
- 可以使用set实现并集、交集、差集
let a = new Set([2, 4, 6, 8])
let b = new Set([0, 2, 4, 10, 12])
let bing = new Set([...a, ...b]) // 2 4 6 8 0 10 12
let jiao = new Set([...a].filter(item => b.has(item))) // 2 4
let bu = new Set([...a].filter(item => !b.has(item))) // 6 8
WeakSet
WeakSet和set一样是不重复值的集合
- 区别一:只能放置对象,不能是值
let w = new WeakSet();
let a = {
a: 1
}
w.add(a);
w.add(1); // Invalid value used in weak set
- 区别二:weakset里面的对象引用不会考虑在垃圾回收机制里面。如果对象不再被使用,就会被回收,不会考虑还存在weakSet里面的。因为weakset成员具有可变性,所以没有size和遍历属性。
实例的操作方法跟set一样。
Map
键值对的集合,各种类型的值(包括对象)都可以作为键
- Object: string - 值
- Map: 值 - 值
const m = new Map();
const m1 = new Map([[1, 2], [2, 3]])
// 接受一个对象作为键
m.set({name: 'zhangsan'}, 'content')
// 接收一个数组作为键
m.set([1,2,3], 'lisi')
// 只有对同一个对象的引用,map才会看作是同一个键
let a = [1,2];
m.set(a, 'wangwu');
console.log(m.get(a)); // wangwu
console.log(m.get([1,2])); // undefined
- Map的键值跟内存地址是绑定的,之哟啊内存地址不一样就被认为是两个键
let m = new Map()
m.set([1], '1');
m.set([1], '1');
console.log(m); // Map(2) {Array(1) => '1', Array(1) => '1'}
Map的属性和方法
- size 获取map的成员数量
- Map.prototype.set(key, value):设置键值对,如果已经有改键值就是更新该值,返回整个Map对象
let m = new Map()
m.set(1, 1).set(1, 2).set(2, 3) // 可以使用链式表达式
console.log(m); // Map(2) {1 => 2, 2 => 3}
- Map.prototype.get(key):获取该键的值,如果没有则返回undefined
- Map.prototype.clear():清除所有成员
其他的方法跟set差不多就不赘述
- map自身转成数组结构
let m1 = [...m]; // [[1,2], [2,3]]
WeakMap
WeakMap和Map一样,是键值对的集合,跟WeakSet一样,有两点与Map不一样
- 区别一: 键值只能是对象,不能是值
let m = new WeakMap([1,1]); // Uncaught TypeError: Iterator value 1 is not an entry object
- 键名所指向的对象,不计入垃圾回收机制
只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。也就是说,一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。
同样,也没有了size和遍历方法
转载自:https://juejin.cn/post/7179046224731832376