likes
comments
collection
share

Map和Set | es6基础

作者站长头像
站长
· 阅读数 44

了解一下es的历史吧

Map和Set | es6基础

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有什么属性

Map和Set | es6基础

实例操作方法

  • 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
  }

应用

  • 可以使用set做数组去重操作
  let array = [1, 3, 3, 3, 5, 6, 7, 7, 7, 7, 8, 8]
  array = Array.from(new Set(array))
  console.log(array); // (6) [1, 3, 5, 6, 7, 8]
  • 可以使用set实现并集、交集、差集
  let a = new Set([2, 4, 6, 8])
  let b = new Set([0, 2, 4, 10, 12])
  let bing = new Set([...a, ...b]) // 2 4 6 8 0 10 12
  let jiao = new Set([...a].filter(item => b.has(item))) // 2 4
  let bu = new Set([...a].filter(item => !b.has(item))) // 6 8

WeakSet

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

Map和Set | es6基础

  • 区别一:只能放置对象,不能是值
  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的属性和方法

Map和Set | es6基础

  • 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和遍历方法

Map和Set | es6基础

转载自:https://juejin.cn/post/7179046224731832376
评论
请登录