ES6中Set与Map数据结构

4 篇文章 0 订阅


前两天电面问到了,支支吾吾只是答了个大概,深入了解一下。

Set

集合,本质是一个构造函数,类似与数组,但成员都是唯一的。

set实例的api

属性:

  • Set.prototype.constructor:构造函数。
  • Set.prototype.size:返回Set实例的成员总数。

操作方法:

  • Set.prototype.add(value):添加某个值,返回Set结构本身。
  • Set.prototype.delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
  • Set.prototype.has(value):返回一个布尔值,表示该值是否为Set的成员。
  • Set.prototype.clear():清除所有成员,没有返回值。

遍历方法(Set中键名与键值相同):

  • Set.prototype.keys():返回键名的遍历器x
  • Set.prototype.values():返回键值的遍历器
  • Set.prototype.entries():返回键值对的遍历器
  • Set.prototype.forEach():使用回调函数遍历每个成员

应用

  1. 去除数组重复成员
let arr=[1,2,1,3,4,2,4]
let unique=[...new Set(arr)] // [1,2,3,4]
  1. 数组深拷贝
// 数组浅拷贝
var a1=[1,2]
var a2=a1
a2[0]=2
a1 // [2,2]
// 深拷贝
var a3=[3,4]
var a4=[...a3]
  1. 并集(Union)、交集(Intersect)和差集(Difference)
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);

// 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}

// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}

// 差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}
  1. NaN在Set中相等
let set = new Set()
let a = NaN
let b = NaN
a==b // false
set.add(a)
set.add(b)
set.size // 1 

WeakSet

特点
WeakSet的成员只能是对象,WeakSet的成员对象都是弱引用,不计入垃圾回收机制,其成员不适合引用,因为它随时会消失。由于 WeakSet 内部有多少个成员,取决于垃圾回收机制有没有运行,运行前后很可能成员个数是不一样的,而垃圾回收机制何时运行是不可预测的,因此 ES6 规定 WeakSet 不可遍历。

WeakMap的api

  • WeakSet.prototype.add(value):向 WeakSet 实例添加一个新成员。
  • WeakSet.prototype.delete(value):清除 WeakSet 实例的指定成员。
  • WeakSet.prototype.has(value):返回一个布尔值,表示某个值是否在 WeakSet 实例之中。

Map

特点
不同于不同的对象,键的值不局限于字符串,可以以对象作为键值。是一种更完善的哈希结构,Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。如果 Map 的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map 将其视为一个键(除NaN)。

Map实例的api

  1. size
  2. Map.prototype.set(key, value)
  3. Map.prototype.get(key)
  4. Map.prototype.has(key)
  5. Map.prototype.delete(key)
  6. Map.prototype.clear()

WeakMap

特点
WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。键名弱引用,键值不是弱引用。


抄自:
阮一峰 《ES6 入门》
MDN - Set

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值