Map 和 weakMap的区别

首先要知道,在JS回收机制,当堆栈不再被引用的时候,浏览器内核会自动回收这个数据

当使用map的时候会触发一个垃圾回收机制的问题

首先Map是一种键值对的集合,其中的键和值可以是任意类型的。与对象类似,它们可以通过键来访问值。不同之处在于,Map可以使用任意类型作为键,而对象只能使用字符串或Symbol类型作为键。Map还提供了许多有用的方法,例如size属性来获取键值对的数量,以及forEach()方法来遍历集合。

Map里面如果存在一个对象,当这个对象被删除的时候,实际上在浏览器的堆里它并不会被删除,因为它还被map引用着,这个时候后续如果对这个对象进行操作就有可能出现内存泄露问题

这里就要说到我们的weakMap:

WeakMap 是一种数据结构,它与 Map 类似,但是它存储的是键值对,其中键是对象类型,而值是任意类型。与 Map 不同的是,WeakMap 的键是弱引用,这意味着如果没有其他变量引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存。

使用 WeakMap 的主要原因是在某些情况下,我们希望存储一些与对象相关的信息,但是又不希望这些信息阻止垃圾回收机制回收对象所占用的内存。

weakMap自身的方法也比map少了许多,我们来做个对比

weakmap的原型上没有Symbol(Symbol.iterator)这个原始方法,这个方法的主要作用是为每一个对象定义了默认的迭代器。该迭代器可以被 for...of 循环使用

const iterable1 = {};

iterable1[Symbol.iterator] = function* () {
  yield 1;
  yield 2;
  yield 3;
};

console.log([...iterable1]);
// Expected output: Array [1, 2, 3]

所以说weakmap是不可迭代的,只能进行一些“增删改查”的操作

不可遍历的主要原因是,由于weakmap的项是一种弱引用

当引用对象被删除时

weakmap中的引用也会被删除,所以weakmap不可遍历

文章链接:http://iwebg.cn/index.php/2023/08/04/map-%e5%92%8c-weakmap%e7%9a%84%e5%8c%ba%e5%88%ab/

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇