Set
ES6
提供了新的数据结构 Set
。它类似于数组,但其成员的值是唯一的,不会重复。
Set
的简单使用:
// 单个添加
const s = new Set();
[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));
for (let i of s) {
console.log(i);
}
// 2 3 5 4
// 将数组转换为 set 对象
const set = new Set([1, 2, 3, 4, 4]);
[...set]
// [1, 2, 3, 4]
方法
方法 | 作用 |
---|---|
对内容的操作 | - |
add(value) |
添加某个值,返回 Set 结构本身。 |
delete(value) |
删除某个值,返回一个布尔值,表示删除是否成功。 |
has(value) |
返回一个布尔值,表示该值是否为 Set 的成员。 |
clear() |
清除所有成员,没有返回值。 |
size() |
返回 Set 实例的成员总数。 |
遍历操作 | - |
keys() |
返回键名的遍历器 |
values() |
返回键值的遍历器 |
entries() |
返回键值对的遍历器 |
forEach() |
使用回调函数遍历每个成员 |
注: 由于 Set
结构没有键名,只有键值(或者说键名和键值是同一个值),所以 keys
方法和 values
方法的行为完全一致。
Map
Map
类似于对象,也是键值对的集合,但是 键
的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object
结构提供了 字符串—值
的对应,Map
结构提供了 值—值
的对应,是一种更完善的 Hash
结构实现。当你需要 键值对
的数据结构,Map
比 Object
更合适。
Map
的简单使用:
const m = new Map();
const o = 'keyName';
m.set(o, 'content');
m.get(o); // "content"
m.has(o); // true
m.delete(o); // true
m.has(o); // false
const map = new Map([
['name', '张三'],
['title', 'Author']
]);
map.size; // 2
map.has('name'); // true
map.get('name'); // "张三"
map.has('title'); // true
map.get('title'); // "Author"
方法
方法 | 作用 |
---|---|
对内容的操作 | - |
size |
返回 Map 结构成员数 |
set(key, value) |
为 Map 设置键名为 key 键值为 value |
get(key) |
读取键名为 key 的键值 |
has(key) |
判断某个键名是否在 Map 中存在,返回 Boolean |
delete(key) |
删除某个键 |
clear() |
清空整个 Map |
Map
的结构和 Set
类似,遍历方法和 set
一致。唯一不同的是:map
存的键值对,拥有正确的 keys
方法和 values
方法。
Weak
ES6
在推出 Set
与 Map
的同时,也推出了两个类似的类:WeakSet
与 WeakMap
。
这两个对象仅有 Set
与 Map
的部分效果,并且其内部使用到的对象会直接被 JavaScript
的 GC
忽略。
需要注意的点:
WeakSet
不能添加基础类型,仅能添加对象(引用类型)。WeakMap
的键不能为基础类型,仅能使用对象(引用类型)。WeakSet
仅有add
、delete
、has
三个方法,且是不可迭代对象(不能被 for...of、扩展运算符使用)。WeakMap
仅有get
、set
、has
、delete
四个方法,且是不可迭代对象。
由于会直接被 GC
所忽略,因此在某些方面会有特殊的用途。