WeakMap

2023-12-05 21:28
文章标签 weakmap

本文主要是介绍WeakMap,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

WeakMap简介

作为es6一种新的数据结构,他是一种键值对的集合。与Map最大的区别有两个

1. 是其中的键必须是对象或非全局注册的符号。

全局注册的符号
const s1 = Symbol.for('mySymbol')
非全局注册的符号
const s1 = Symbol('mySymbol')

了解Symbol.for

2. 不会创建对它的键的强引用

不会像变量一样随着作用域的销毁而被清除就是强引用

一个对象作为 WeakMap 的键存在,不会阻止该对象被垃圾回收。当该对象的所有强引用都销毁时,该对象的弱引用也随之自动被清除。那么就会在 WeakMap 中相应的值便成为了进行垃圾回收的候选对象,只要它们没有其他的引用存在。

我们使用Map做下简单对比

let map = new Map()
let key = { name: 1 }
map.set(key, '我的键是一个对象')
key = null
setTimeout(() => {console.log(map) //无论延迟多久,map里面的键值对都会存在
}, 10000);
let wMap = new WeakMap()
let key2 = { name: 1 }
wMap.set(key2, '我的键是一个对象')
key2 = null
setTimeout(() => {console.log(wMap)  //会被浏览器的回收机制回收(测试edge浏览器十秒回收),WeakMap里面的键值对已经清空。
}, 10000);

可以看到在使用Map创建的对象里,即使key对象和map对象已经没有任何地方使用,甚至我们将key设置为了null,但是在内存里,{name: 1}依旧会存在,因为在map对象中的键依旧对它有着强引用的关系。

而我们使用的WeakMap创建的对象,当我们将key2设置为bull后,因为wMap的键是弱引用的关系,所以该键值会直接被垃圾回收机制回收,该键值对会直接被清除。

常见方法

delete
删除任何与 key 关联的值。删除之后,WeakMap.prototype.has(key) 将会返回 false。

get
返回与 key 关联的值,如果不存在则返回 undefined。

has
返回一个布尔值,断言某个值是否已经与 WeakMap 对象中的 key 关联。

set
给 WeakMap 对象中的 key 设置 value。返回该 WeakMap 对象。

应用场景

  1. Vue 3 的响应式系统使用了 Proxy 对象来拦截对响应式对象的访问,然后在内部使用 WeakMap 来跟踪对象与其对应的副作用(例如渲染函数或侦听器)。这样,当响应式对象发生变化时,Vue 3 可以根据这些依赖关系自动进行更新。
    通过 WeakMap,Vue 3 实现了一种弱引用关系,这意味着如果一个对象不再被其他地方引用,它将被垃圾回收机制自动回收,同时也会自动清理相应的依赖关系。

  2. WeakMap还常常被用来保存对象的私有数据。这是因为WeakMap的键不可遍历,所以我们可以利用这个特性来存储一些只有特定代码能够访问的数据。

上面是一个人们经常拿来说明WeakMap应用场景的一个方法,但实际上描述并不完全正确。
实际上WeakMap 方式定义私有属性的主要作用是保护属性的名称,防止和其他实例的同名属性发生冲突。但不能保证属性的值不被修改。使用getPrivateVal方法外还可以直接使用privateData.get(obj)的方式进行访问甚至对值进行修改。

  1. 曾经看到使用WeakMap进行栈的模拟实现
let Stack = (function(){let items = new WeakMap()class Stack {constructor () {items.set(this, [])}pop () { // 出栈return items.get(this).pop()}push (v) { // 入栈items.get(this).push(v)}peek () { // 获取当前栈顶return items.get(this)[items.get(this).length - 1]}size () { // 栈长度return items.get(this).length}isEmpty () { // 栈是否为空return items.get(this).length === 0}clear () { // 清空栈items.get(this).length = 0}}return Stack
})()

这篇关于WeakMap的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/459205

相关文章

面试题每日一练,测测你对JavaScript WeakMap 和数组方法的理解

今天的挑战题目涉及到JavaScript中的 WeakMap、数组方法 map 和 reduce,以及对对象引用的管理。让我们一步步解析这段代码,看看它会输出什么以及为什么。 代码解析 首先,代码创建了一个 WeakMap 实例: const weakMap = new WeakMap(); WeakMap 是一个键必须是对象的特殊类型的 Map,其中的键是弱引用,这意味着如果没有其他引用指向

javascript中的WeakMap和WeakSet

WeakMap的key不能是基本类型 let weakMap = new WeakMap();let obj = {};weakMap.set(obj, "ok"); // works fine (object key)// can't use a string as the keyweakMap.set("test", "Whoops"); // Error, because "test"

es6(基础十四) Map与WeakMap

一、Map     1.map的作用: key可以是任意的内容    2.使用 长度:size 删除:delete clear 增:set  查:get     传统的对象的key只能是字符串作为键名 let obj = {"a":123//[1,2,3]:123//会报错,只能是字符串作为键名}console.log(obj)     而用Map,key可以是任意的类型 let m

Proxy、Reflect和WeakMap

Proxy、Reflect和WeakMap是ES6中引入的三个新的JavaScript特性。 Proxy Proxy对象用于定义基本操作的自定义行为(例如属性查找、赋值、枚举、函数调用等)。 const handler = {get(target, prop, receiver) {console.log(`GET ${prop}`);return Reflect.get(target, p

ES6:Map()与WeakMap()

一、Map() 1.1 简介 ES6 提供了 Map 数据结构,它类似于对象,是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。 我们可以通过 new Map()去创建它。 1.2. Map的创建、设置与获取 1.对单个数据设置与获取 <script>//创建Map对象const mapData = new Map();//添加数据(键,值)m

webpack源码分析——makeCacheable函数和weakMap的缓存应用场景

一、makeCacheable 函数 函数功能 该函数是将一个不带缓存的函数 realFn 转换成一个带缓存的版本。这样可以提高性能,因为相同的输入值不需要每次都重新计算,而是可以从缓存中直接获取结果。 二、函数分析 使用 WeakMap 弱引用特性创建缓存 const cache = new WeakMap(); getCache 函数 const getCache =

理解JavaScript中的WeakSet和WeakMap

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》 文章目录 摘要:引言:正文:1. Weak

34.JavaScript简单的WeakMap和WeakSet(弱映射、弱集合)基础知识,我劝你进来看看

文章目录 弱映射与若集合(WeakMap、WeakSet)前言WeakMapWeakMap使用案例WeakSet总结 弱映射与若集合(WeakMap、WeakSet) 前言 在本专栏的《垃圾回收》章节详细介绍了JavaScript引擎在何种情况下会回收一个变量占用的内存空间。 简单来讲,如果一个变量、对象是“不可达”的,那么这个变量、对象就没有必要继续保存在

17.JS中的object、map和weakMap

1.object和map的区别 2.weakMap和map的区别 (1)Map本质上就是键值对的集合,但是普通的Object中的键值对中的键只能是字符串。而ES6提供的Map数据结构类似于对象,但是它的键不限制范围,可以是任意类型,是一种更加完善的Hash结构。如果Map的键是一个原始数据类型,只要两个键严格相同,就视为是同一个键。 实际上Map是一个数组,它的每一个数据也都是一个数

总结Symbol、Set、WeakSet、Map、WeakMap

前言         这几个es6+新增的数据结构和变量类型,不经常用,好容易忘记啊。在此记录一下,方便复习。 Symbol         Symbol是es6新增的基本数据类型,用于生成独一无二的值。   基本使用 1、创建两个描述相同的值,也不会相等。 let s1 = Symbol(1)let s2 = Symbol(1)s1 !==s2 //true 2、s1.de