参考链接:https://es6.ruanyifeng.com/#docs/set-map

map与对象类似,set与数组类似

map和set对象常用遍历共有方法:

  • prototype.keys():返回键名的遍历器(key)
  • prototype.values():返回键值的遍历器(value)
  • prototyp.entries():返回键值对的遍历器(key,value一起)
  • prototype.forEach():使用回调函数遍历每个成员

map和set常用的共有属性:

  • size:等价于arr的length

    1、Map

    map默认遍历器生成函数为entries方法(默认可遍历的)

方法

js的对象,本质是键值对形式,传统对象只能用string作为key;map弥补了这一点不足。map的遍历顺序就是插入顺序
map方法

  • set:set(key, value)的形式为map对象添加元素
  • get:get(key)的形式读取元素
  • delete:删除元素
  • has:判断是否存在

map的key必须要唯一,不允许出现相同的key;如果用set设置同一个key,后面的会覆盖前面的

  1. let map = new Map()
  2. map.set('key', 123)
  3. map.set('key', 234)
  4. alert(map) // Map(5) { 'key' => 234,}

map的key实际上时跟内存地址绑定的,只要内存地址不一样,就视为两个键。

  1. const map = new Map();
  2. const k1 = ['a'];
  3. const k2 = ['a'];
  4. map
  5. .set(k1, 111)
  6. .set(k2, 222);
  7. map.get(k1) // 111
  8. map.get(k2) // 222
  9. map.set({name: 'zx'}, 111)
  10. map.get({name: 'zx'}) // undefined

遍历

首先调用这些遍历方法,打印出来

  1. let map = new Map()
  2. map.set('1', 'asad')
  3. map.set('2', 'asad')
  4. map.set('3', 'asad')
  5. console.log(map.keys())
  6. console.log(map.values())
  7. console.log(map.entries())
  8. console.log(map[Symbol.iterator]())

image.png
不难看出,这些都是迭代对象;使用 Array.isArray() 检测会返回false;但可以通过 Array.from() 直接转换为数组(也可以通过[…]的方式转化数组)
由打印结果发现 map.entries === map[Symbol.iterator]
对于iterator对象遍历最合适的方法就是 for ... of ;对于map.keys()和map.values()这些简单的就不必多说,这里主要遍历map.entries()内部是什么数据结构

  1. for(let value of map.entries()) {
  2. console.log(value)
  3. console.log(value instanceof Array)
  4. }
  5. output:
  6. [ '1', 'asad' ]
  7. true
  8. [ '2', 'fasdfa' ]
  9. true
  10. [ '4', 'fasdfasdf' ]
  11. true

显然,entries遍历的是键值对一起的,以数组的形式;item[0]key;
item[1]是value。

2、WeakMap

差别

与map类似;两点差别:

  • key只能是对象
  • key所指向的对象不计入垃圾回收机制

WeakMap 就是为了解决这个问题而诞生的,它的键名所引用的对象都是弱引用,即垃圾回收机制不将该引用考虑在内。因此,只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。也就是说,一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。
由于weakmap中的key随时都有可能被销毁,所有没必要提供迭代键值对的能力,所以weakmap没有迭代遍历的那些方法。

3、Set

set默认遍历器生成函数是它的values方法(默认可遍历的)

set的遍历顺序就是插入顺序,set也可以看做是key value的形式,它的key value是相等的

  1. set.values === set.keys // true
  2. // 注意 values() 和 keys() 方法不相等的
  3. set.values() === set.keys() // false

set方法

  • add:添加元素
  • delete:删除元素
  • clear:清空set
  • has:判断是否包含某个元素

set的key和value虽然相同,但是set.keys和set.values并不相等,是两个独立的对象

  1. let set = new Set([1, 2, 3, 4, 5])
  2. console.log(set.keys())
  3. console.log(set.values())
  4. console.log(set.keys() == set.values())

image.png
set.entries方法其实对于set意义不大,因为key、value相同,用法和回调函数内的值和map类似,也是数组,数组第一项与第二项相等。
与map不同的是,set的是默认可以遍历的,它的默认遍历器生成函数就是它的values方法

  1. set[Symbol.iterator] === set.values

4、WeakSet

与类似;两点差别:

  • WeakSet的成员只能是对象
  • 成员所指向的对象不计入垃圾回收机制,所以无迭代(无法遍历)