带键集合

映射

Map对象

ES6新增Map对象用于将一个值映射到另一个值,一个Map对象就是一个简单的键值对映射集合,并可以按照数据插入时的顺序遍历所有的元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let sayings = new Map();
sayings.set('dog', 'woof');
sayings.set('cat', 'meow');
sayings.set('elephant', 'toot');
console.log(sayings.size); // 3
console.log(sayings.get('fox')); // undefined
console.log(sayings.get('dog')); // woof
console.log(sayings.has('dog')); // true
sayings.delete('dog');
console.log(sayings.has('dog')); // false
for(let [key, value] of sayings) {
console.log(`${key} goes ${value}`);
}
// dog goes woof
// cat goes meow
// elephant goes toot
sayings.clear();
console.log(sayings.size); // 9

Object与Map的区别:

  • Object的键均为String类型,在map里键可以是任意类型。
  • Object的长度必须手动计算。
  • Map的遍历遵循元素的插入顺序。
  • Object有prototype,映射中有一些缺省的键,可以使用Object.create(null)回避。

下面三点可以决定用Object还是Map:

  • 如果键在运行时才知道,或者所有的键类型相同,所有的值类型相同,使用Map。
  • 如果需要将原始值存储为键,则使用map。Object将每个键视为字符串,不管是数字布尔值还是其他原始类型。
  • 如果需要对个别元素进行操作,使用Object。

WeakMap对象

WeakMap对象也是键值对的集合,但它的键必须是对象类型,值可以是任意类型。它的键被弱保持,当其值所指对象没有其他地方引用的时候,它会被GC回收掉。WeakMap的键是不可枚举的。

WeakMap常被用来存储一个对象的私有数据或实现细节:

1
2
3
4
5
6
7
8
9
10
11
12
consr privates = new WeakMap();

function Public() {
const me = {}; // 私有数据
privates.set(this, me);
}

Public.prototype,method = function() {
const me = privates.get(this);
}

module.exports = Public;

集合

set对象

Set对象是一组数据的集合,这些值是不重复的,可以按照添加顺序来遍历:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
let mySet = new Set();
mySet.add(1);
mySet.add('test');
mySet.add(2);
mySet.add(1);
console.log(mySet.size); // 3
console.log(mySet.has(1)); // true
mySet.delete(1);
console.log(mySet.size); // 2
for (let item of mySet) console.log(item);
// test
// 2

// 集合转数组
console.log(Array.from(mySet)); // ["test", 2]
console.log([...mySet]); // ["test", 2]

// 数组转集合
console.log(new Set([1, 2, 3, 4])); // {1, 2, 3, 4}

在JavaScript中一般使用数组来存储一组数据,集合对象有以下优势:

  • 数组中indexOf函数效率低下
  • Set对象允许根据值删除元素,而数组必须使用基于下标的splice方法
  • 数组的indexOf方法无法找到NaN
  • Set对象存储不重复的值,所以不需要手动处理包含重复值的情况

WeakSet对象

WeakSet中的对象不重复且不可枚举,并且值必须是对象类型。如果集合中的对象不存在其他引用,则该对象将会被垃圾回收。

Map和Set的键和值相等判断

Map对象的键相等性和Set对象的值相等性均基于same-value-zero算法

  • 判断使用与===相似的规则。
  • -0+0相等。
  • NaN与自身相等(与===有所不同)

本文参考资料

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • © 2019-2021 musi

请我喝杯咖啡吧~

支付宝
微信