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
作者:朝朝与乐乐
原文始发于微信公众号(前端24):Map和Set | es6基础
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/216178.html