学习JavaScript数据结构与算法 第八章

三槐 / 2023-05-09 / 原文

八,字典和散列表

8.3 ES2015 Map 类

ECMAScript 2015 新增了 Map 类。

const map = new Map();

map.set('Gandalf', 'gandalf@email.com');
map.set('John', 'johnsnow@email.com');
map.set('Tyrion', 'tyrion@email.com');

console.log(map.has('Gandalf')); // true

console.log(map.size); // 3

console.log(map.keys()); // 输出{"Gandalf", "John", "Tyrion"}

console.log(map.values()); // 输出{"gandalf@email.com", "johnsnow@email.com","tyrion@email.com"}

console.log(map.get('Tyrion')); // tyrion@email.com

ES2015 的 Map 类的 values 方法和 keys 方法都返回 Iteratr.

删除 map 中的元素可以用 delete 方法。

map.delete('John');

clear 方法会重置 map 数据结构。

8.4 ES2015 WeakMap 类 和 WeakSet 类

除了 Set 和 Map 这两种新的数据结构,ES2015 还增加了它们的弱化版本,WeakSet 和 WeakMap。

基本上,Map 和 Set 与其弱化版本之间仅有的区别是:

  • WeakSet 或 WeakMap 类没有 entries、keys 和 values 等方法
  • 只能用对象作为键。创建和使用这两个类主要是为了性能。

WeakSet 和 WeakMap 是弱化的(用对象作为键),没有强引用的键。这使得 JavaScript 的垃圾回收器可以从中清除整个入口。

另一个优点是,必须用键才可以取出值。这些类没有 entries、keys 和 values 等迭代器方法,因此,除非你知道键,否则没有办法取出值。

const map = new WeakMap();

const ob1 = { name: 'Gandalf' };
const ob2 = { name: 'John' };
const ob3 = { name: 'Tyrion' };

map.set(ob1, 'gandalf@email.com');
map.set(ob2, 'johnsnow@email.com');
map.set(ob3, 'tyrion@email.com');

console.log(map.has(ob1)); // true
console.log(map.get(ob3)); // tyrion@email.com
map.delete(ob2); 

同样的逻辑也适用于 WeakSet 类。