前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第八十一期:数据结构(Map 和Set)

第八十一期:数据结构(Map 和Set)

作者头像
terrence386
发布2022-07-15 11:03:12
2530
发布2022-07-15 11:03:12
举报

Map 和 Set

Map 和 Set是两个以简单著称的数据结构,在es6的标准中已经标准化了。

为什么需这两种数据结构

在我们真正在项目中使用这两种数据结构之前,了解他们的起源以及为什么我们需要在js中使用它们似乎也很重要。

在es5中,传统的数组并不支持开发人员常用的几个功能。比如判断是否包含一个特定的元素,或者添加一个不重复的元素。这些在其他语言中时常见的API,但是在js中,需要开发人员自己去实现类似的功能。

代码语言:javascript
复制
let setOrMap = Object.create(null);
setOrMap.someKey = someValue
if(setOrMap.someKey){
  // has somekey
}

let returnedValue = setOrMap.someKey

尽管使用object.create()可以解决大部分问题。但是它无法解决的一个问题是,它所创建的主键只能是字符串,因为Object只允许将字符串作为键,因此我们可能会无意中以值覆盖彼此:

代码语言:javascript
复制
let map = Object.create(null);

let b = {}
let c = {}

map[b] = 10
map[c] = 20

// 打印map
// [object Object]: 20

了解 Map 和 Set

在实际使用Map 和 Set之前,我们需要了解何时何地需要使用它们。每种数据结构,无论是原生的还是定制的,都有自己的优缺点。

我们不仅仅要利用这些优势,更重要的是避免它们的弱点。为了理解其中的一些内容,我们将探索SET和map类型,以及为什么需要它们,以及在哪里使用它们。

主要有四种不同的Set和Map:

Map :一种键值对,其中的键既可以是对象,也可以是原始值,可以包含任意值。

WeakMap:一种键值对,其中键只能是一个对象,并且可以包含任意值。密钥被弱引用;这意味着,如果不使用,它们不会被阻止被垃圾收集。

Set:允许用户存储任何类型的唯一值的数据类型。

WeakSet:与set类似,但保持弱引用。

WeakMap 有多弱?

WeakMap是键值对的集合。并且键的引用是弱引用。键必须是对象,值可以是任意值。

在比较Map和WeakMap之前,了解何时使用特定的数据结构至关重要。

如果在任何时候都需要知道集合的键,或者需要迭代集合,则需要使用Map,因为WeakMap的键是不可枚举的,也就是说,不能在弱映射中获得可用键的列表,因为它只维护一个弱引用。

我们应该自然而然地提出两个问题:

如果我们用了Map 怎么办?

这没什么,我们有可能会导致内存泄露,有可能什么事也不会发生,这取决于我们对Map的使用程度,通常情况下,什么事儿也没有。

什么是弱引用?

弱引用是指在移除所有引用者的情况下,允许对对象引用的所有内容进行垃圾回收。如果感到有疑问的话,我们看一个例子:

代码语言:javascript
复制
var map = new Map()
(function(){
  var key = {} // 一个对象
  map.set(key,10) // 引用这个对象
  
})()

我们都知道,IIFE立即执行函数的主要用途是:我们可以立即执行一个函数并删除其作用域,从而避免内存泄漏。在本例中,尽管我们已经将键和映射设置器包装在一个IIFE中,但它不会对键进行垃圾收集,因为映射在内部仍然保留对键及其值的引用。

代码语言:javascript
复制
var wmap = new WeakMap()
(function(){
  var key = {}; // 一个对象
  map.set(key,10); // 引用这个对象
  
})()

当使用WeakMap编写相同的代码时,一旦IIFE立即执行函数被执行,键和该键的值就会从内存中删除,因为该键已超出范围;

这有助于将内存使用降至最低。

WeakSet 和 WeakMap 非常相似。他们的api 差别这里就不再赘述了,有兴趣的同学可以自行查阅相关文档。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JavaScript高级程序设计 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么需这两种数据结构
  • 了解 Map 和 Set
  • WeakMap 有多弱?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档