第一部分:Set和Map基本概念
  • Set数据结构类似于数组,区别是set数据结构内每一项的值是唯一的(注意变量的值类型和引用类型),内部判断相等的规则为===,但是NaN等于自身,由于这些特性所以可以很方便的进行数组去重[...new Set(array)]
  • Map数据结构类似于对象,区别是键不仅限于字符串,是更完善的hash结构的实现,对于相同的键赋值会造成覆盖(需要注意键的类型是值类型还是引用类型),只要严格相等就是为是一个键,包括0等于-0,NaN也被视为同一个键,Map构造函数可以接受一个表示键值对儿的数组,Map,Set(或者是说可以接受任何具有Iterator接口且每个成员都是一个双元素数组的数据结构)。
  • weakSet和weakMap。他们均与对应的Map和Set相似,区别是,weakSet的成员只能是对象,weakMap的键名只能是对象,不过null除外。webSet内的对象均是弱引用,即垃圾回收机制不会考虑webSet对该对象的引用。同样的weakMap的键名所指向的对象也不会被计入垃圾回收机制。

第二部分:Set的常用属性方法
  • Set的常用属性有Set.prototype.constructor,和Set.prototype.size
  • Set的方法均可以分为操作方法和遍历方法。 | 方法名 | 描述 | | —- | —- | | add(value) | 返回set本身 | | delete(value) | | | has(value) | 返回一个布尔值,表示是否是Set的成员 。 | | clear() | 清除所有,没有返回值。 | | keys() | 返回键名的便利器,set只有键值,所以与values()方法相同。 | | values() | 返回键值得便利器,是Set函数默认的便利器生成函数,可以直接对Set进行for of遍历。 | | entries() | 返回键值对儿的便利器。 | | forEach() | 使用回调函数遍历每个成员。 | | map() | 数组的方法。 | | filter() | 数组的方法。 |
  • 扩展运算符内部使用for…of,可以用于set结构,借助于数组的map,filter方法可以方便的实现并集、交集、差集
  • 暂时没有可以改变原来Set结构的方法。变通解决,映射出新结构赋值回去,用Array.from()
  • weakSet与Set的方法区别是,由由于内部引用不计入垃圾回收机制,所以ES6规定其不可以遍历,自然四个遍历方法也不可用,也没有size属性,没有clear()方法。

第三部分:Map的常用属性方法

  • Map.prototype.size() | 函数名 | 描述 | | —- | —- | | set(key,value) | 设置key所对应的键值,返回整个Map结构。 | | get(key) | 获取key对应的键值,或者undefined。 | | has(key) | 表示某个键是否存在在Map数据结构中。 | | delete(key) | 删除某个键,返回删除是否成功。 | | clear() | 清除所有成员,没有返回值。 | | keys() | 返回键名的便利器。 | | values() | 返回键值得便利器。 | | entries() | 返回所有成员的便利器,Map数据结构默认便利器接口。 | | forEach() | 遍历Map的所有成员,遍历顺序就是插入顺序。 |
  • Map数据结构使用扩展运算符可快速的转化为数组,结合数组的map方法、filter方法,可以实现Map的遍历和过滤(Map本身不含有这两个方法)
  • Map与其他数据结构的互相转换
    • Map转数字:扩展运算符
    • 数组转Map:传入构造参数
    • Map转对象:for of遍历Map,逐个追加到对象
    • 对象转Map:for of遍历对象的keys,对Map对象逐个用set方法设置。
    • Map转JSON:键名都是字符串->先转为对象,否则先转为数组->然后转JSON
    • JSON转Map:先转为对象->转为map
  • weakMap:由于不计入垃圾回收机制,所以没有遍历方法(key,values,entries),无size属性,不支持clear方法,只支持set、get、has、delete。典型的应用场景是以DOM节点作为键名的场景。