集合的概念以及和数组的区别
其实数组也是集合, 只不过数组的索引是数值类型.当想用非数值类型作为索引时, 数组就无法满足需要了.
而 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 和 valuemap.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 而已.
ES6 中的 Map 和 Set 集合
下面正式来讨论这两种集合的特点
Map
Map 中存储的是 key-value 形式的键值对, 其中的 key 和 value 可以是任何类型的, 即对象也可以作为 key . 这比用对象来模拟的方式就灵活了很多
Map 的创建和初始化
可以用new Map()构造函数来创建一个空的 Map
// 创建一个空的 Map let map = new Map();
也可以在 Map() 构造函数中传入一个数组来创建并初始化一个 Map. 传入的数组是二维数组, 其中的每一个子数组都有两个元素, 前者会被作为 key, 后者会被作为 value, 这样就形成了一个 key-value 键值对. 例如:
// 用数组来创建一个 非空的 Map let array = [ // 定义一个二维数组, 数组中的每子都有两个元素 ['key1' , 'value 1'], // key 是 字符串 "key1", value 是字符串 "value 1" [{} , 10086] , // key 是个对象, value 是数值 10086 [ 5, {} ] // key 是个数值类型, value 是对象];let map = new Map(array); // 将数组传入 Map 构造函数中
新闻热点
疑难解答
图片精选