集合的概念以及和数组的区别
其实数组也是集合, 只不过数组的索引是数值类型. 当想用非数值类型作为索引时, 数组就无法满足需要了.
而 Map 集合可以保存多个键 - 值对(key-value), Set 集合可以保存多个元素.
对 Map 和 Set 一般不会逐一遍历其中的元素. Map 一般用来存储需要频繁取用的数据, Set 一般用来判断某个值是否存在其中.
ES 5 中对 Map 和 Set 的模拟方法
在 ES 5 中, 没有 Set 和 Map 集合, 一般使用对象来模拟这两种集合, 对象的属性作为键(key), 以属性值作为值(value), 即以 property: property-value 来模拟 key-value 的形式. 具体实现如下:
模拟 Map 的键值对集合:
- // 创建一个 Map 对象
- var map = Object.create(null);
- // 添加属性和属性值, 即 添加 key 和 value
- map.key1 = 'value 1';
- map.key2 = {
- };
- // 取得 key 对应的 value
- console.log(map.key1); // "value 1"
- console.log(map.key2); // "Object {}"
模拟 Set :
- // 创建一个 Set 对象
- var set = Object.create(null);
- // 添加属性和属性值, 即 添加 key 并令其值为 true, 即表示这个 key 存在于集合中
- set.key = true;
- // 判断 key 是否存在, 然后进行下一步的操作
- if(set.key) {
- ...
- }
用对象模拟这两种集合的缺陷
由于对象中的属性名必须是字符串, 如果传入的不是字符串则会强制转换成对应的字符串类型(强制转换方面的知识可以看这篇文章点击)
一般使用 if 语句来判断一个 key 是否存在于集合中, 当这个 key 对应的 value 为 false 或者可以被强制转换为 false 时, 则 if 语句认为这个 key 不存在. 但是其实是存在的, 只不过 value = false 而已.
- // 创建一个空的 Map
- let map = new Map();
- // 用数组来创建一个 非空的 Map
- let array = [ // 定义一个二维数组, 数组中的每子都有两个元素
- ['key1' , 'value 1'], // key 是 字符串 "key1", value 是字符串 "value 1"
- [{} , 10086] , // key 是个对象, value 是数值 10086
- [ 5, {} ] // key 是个数值类型, value 是对象
- ];
- let map = new Map(array); // 将数组传入 Map 构造函数中
- map.forEach(function(value, key, ownerMap){
- console.log(key, value); // 每对键和值
- console.log(ownerMap === map); // true
- });
- // 创建一个数组
- let array = [1, 'str']; // 一维数组
- // 用数组来初始化 set
- let set = new Set(array);
- let set = new Set();
- set.add(1, 2, 3);
- console.log(set.has(1), set.has(2), set.has(3)); // true false false 可以看到只有第一个参数被加入进了 set
- has(key)
- delete(key)
- clear()
- set.forEach(function(value, key, ownerSet){
- console.log(value === key, set === ownerSet); // true true
- });
来源: https://www.cnblogs.com/shikaka/p/10576531.html