Map和Set

57 阅读3分钟

Set

set结构类似于数组,成员唯一,没有重复的值,但是对象不被认为是唯一值,但是添加的是同一个对象变量还是属于同一值

  const s = new Set([{}, {}])
  console.log(s.size); // 2
  
  const a = {
    name: 'zhangsan'
  }
  const s = new Set([a,a])
  console.log(s); // Set(1) {{…}}

set属性:

image.png

实例操作方法

// add:添加值,返回set本身值
a.add(7).add(8).add(8)

// delete:删除值,返回布尔值,判断是否删除成功
 a.delete(2)

// has:判断set有没有该成员,返回布尔值
 a.has(2)

// clear:清除所有成员,没有返回值
a.clear()

实例遍历操作

  • keys:返回键名遍历器
  • values:返回值遍历器
  • entries:返回键值对遍历器
  • forEach:遍历每一个成员 但是set没有键值,所以用值做键
  let k = a.keys(); // SetIterator {1, 2, 3, 4}
  let v = a.values(); // SetIterator {1, 2, 3, 4}
  let e = a.entries(); // SetIterator {1 => 1, 2 => 2, 3 => 3, 4 => 4}

set的默认遍历器就是values,所以可以直接遍历

  const a = new Set([1, 2, 3, 4])
  Set.prototype[Symbol.iterator] === Set.prototype.values // true
  for(let v of a) {
    console.log(v); // 1 2 3 4
  }

WeakSet

WeakSet和set一样是不重复值的集合

image.png

  • 区别一:只能放置对象,不能是值
  let w = new WeakSet();
  let a = {
    a: 1
  }
  w.add(a);
  w.add(1); // Invalid value used in weak set
  • 区别二:weakset里面的对象引用不会考虑在垃圾回收机制里面。如果对象不再被使用,就会被回收,不会考虑还存在weakSet里面的。因为weakset成员具有可变性,所以没有size和遍历属性。

实例的操作方法跟set一样。

Map

键值对的集合,各种类型的值(包括对象)都可以作为键

  • Object: string - 值
  • Map: 值 - 值
  const m = new Map();
  const m1 = new Map([[1, 2], [2, 3]])
  // 接受一个对象作为键
  m.set({name: 'zhangsan'}, 'content')
  // 接收一个数组作为键
  m.set([1,2,3], 'lisi')
  
  // 只有对同一个对象的引用,map才会看作是同一个键
  let a = [1,2];
  m.set(a, 'wangwu');

  console.log(m.get(a)); // wangwu
  console.log(m.get([1,2])); // undefined
  • Map的键值跟内存地址是绑定的,内存地址不一样就被认为是两个键
  let m = new Map()
  m.set([1], '1');
  m.set([1], '1');
  console.log(m); // Map(2) {Array(1) => '1', Array(1) => '1'}

Map的属性和方法

image.png

  • size 获取map的成员数量
  • Map.prototype.set(key, value):设置键值对,如果已经有改键值就是更新该值,返回整个Map对象
  let m = new Map()
  m.set(1, 1).set(1, 2).set(2, 3) // 可以使用链式表达式
  console.log(m); // Map(2) {1 => 2, 2 => 3}
  • Map.prototype.get(key):获取该键的值,如果没有则返回undefined

  • Map.prototype.clear():清除所有成员 其他的方法跟set差不多就不赘述

  • map自身转成数组结构

let m1 = [...m]; // [[1,2], [2,3]]

WeakMap

WeakMap和Map一样,是键值对的集合,跟WeakSet一样,有两点与Map不一样

  • 区别一: 键值只能是对象,不能是值
let m = new WeakMap([1,1]); // Uncaught TypeError: Iterator value 1 is not an entry object
  • 键名所指向的对象,不计入垃圾回收机制

只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。也就是说,一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。

同样,也没有了size和遍历方法 image.png