ES6-note-Set和Map(草稿)

前述

  在ES5中,主要用来存储数据的集合就是数组,当然也可以用对象方式存储键值对类型的非数组型集合,数组主要通过整形下标去定位具体下标位置元素,对查询操作来说,时间复杂度O(1),比较快,非数组型对象存储方式能够通过类似person.name或是person['name']方式获取person对象中键为"name"所对应的值,但是对于有一些特殊的应用场景,例如:

let set = Object.create(null);
set[5] = 4;
set['5'] = 5;
console.log(set[5], set['5']);

  上面的实例打印的结果是什么呢?即便你有些年工作经验,有可能还会被小小的迷惑一下,可能会报错或者可能输出4和5?但结果是输出两个5,这是为什么呢,对于这种Nubmer类型的属性,解析器会把它转换成为字符串类型,所以在内存中,属性5的值会被"5"的值覆盖掉(属性还可以是小数类型),对象类型的属性会被记录成为"[object Object]",但有些情况下,我们可能偏偏想要存储数值类型和字符类型共存或者是以对象作为属性的集合呢,那ES5中的数据结构似乎确实需要扩展高级的数据结构才能应对了。

Set和Map基本用法

  数组去除是js实际项目开发以及面试中常常会涉及到的知识点,方法多种多样,网上能够罗列出10多种(挑选三种思想常用):

1. 先排序,再将相邻不同值元素依次存入新数组;
2. 定义新数组,将原数组中的元素逐渐添加进去,再利用indexOf判断过滤;
3. 上例中的使用非数组集合也是中不错的方法(效率高,缺点就是无法区分数值类型和字符类型的值);

  好像有点麻烦,ES6提供的Set就能够派上用场了:

 new Set([1, 2, 3, 1, 2, 3, 4, '4'])
 
// 结果
Set(5) {1, 2, 3, 4, "4"}

  Set还有个功能就是快速的判断指定元素是否存在于集合中: set.has(element)就可以,Set还提供了对集合的删除或清空等操作。

  Map提供了另一重要应用,能够根据key快速获取相应值,而且和Set一样,对数值、字符、对象类型的键不会进行转换:

new Map([[5, 4], ['5', 5], [{}, 6 ], [{}, 7]])

// 结果
Map(4) {5 => 4, "5" => 5, Object {} => 6, Object {} => 7}
posted @ 2019-04-11 20:29  boykait  阅读(110)  评论(0编辑  收藏  举报