学习ES6: Set&Map

http://es6.ruanyifeng.com/#docs/set-map

Set

概览

类似数组,成员值唯一。

1
2
3
4
5
6
7
8
9
10
11
12
13
const items = new Set([1, 2, 3, 4, 5, 5, 5, 4, 3, 2, 1]);

[...items]; // [1, 2, 3, 4, 5]

// 获取长度
items.size; // 5

// 添加元素
items.add(6);
item.size; // 6
items.add(6);
item.size; // 6

衍生技巧

数组去重

1
2
3
4
5
6
7
8
9
10
let arr = [1, 2, 3, 3, 2, 1];
arr.length; // 6

// one
arr = [...new Set(arr)];
arr.length; // 3

// two
arr = Array.from(new Set(arr));
arr.length; // 3

… + set => map filter

扩展运算符 ...Set 结构相结合,就可以间接的使用 map, filter 等。

1
2
3
4
5
6
7
let set = new Set([1, 2, 3]);
set = new Set([...set].map(x => x * 2));
// {2, 4, 6}

set = new Set([1, 2, 3, 4, 5]);
set = new Set([...set].filter(x => (x % 2) == 0));
// {2, 4}

注意

  • Set 添加元素时,不发生类型转换。
  • NaN 只能添加一个。
  • {} 空对象总是不相等。
1
2
3
4
5
6
7
8
9
10
11
const s = new Set();

s.add({});
s.add({});
s.add(8);
s.add('8');
s.add(NaN);
s.add(NaN);

s.size; // 5
s; // {{}, {}, 8, '8', NaN}
  • Set 遍历顺序即插入顺序。
  • Set 键名键值相同。
  • 目前无法在遍历Set的过程中,同步改变原有的结构。

常用方法及属性

方法或属性 作用 返回值
Set.size 返回成员总数 Number
Size.add(value) 添加value Set
Size.delete(value) 删除成员 Boolean
Size.has(value) 判定value是否是成员 Boolean
Size.clear() 清空 undefined

WeakSet

Set 类似, 但 WeakSet 中的成员只能是对象,不能是别的类型值

当试图添加其它类型值时,会抛出TypeError异常。

WeakSet 不可遍历。

WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中

WeakSet 没有 size 属性和遍历方法。

Map

概览

  • 对象,键值对的集合。
  • 键不再仅限于字符串。
  • 当键为对象时,只有对同一个对象的引用,Map 结构才将其视为同一个键。
  • 当键为简单类型值,只要两个值严格相等,则视为同一个键。
  • NaN 视为同一键。

常用属性和方法

属性或方法 作用 返回值
size 返回成员总数 Number
set(key, value) 设置键名为key,值为value的成员 Map
get(key) 读取key对应的成员值
has(key) 是否有键值为key的成员 Boolean
delete(key) 删除key对应的成员 Boolean
clear() 清空 undefined

WeakMap

  • 只接受对象作为键名(不包括null),不接受其它类型作为键名
  • 其他参考WeakSet。