深入理解 Vue 3 响应性原理 -- Set/Map/WeakMap 函数

本文深入浅出地介绍了Vue3中的响应性原理,通过实例演示了WeakMap、Map和Set这三种数据结构的特点和使用方法,以及它们与Object的区别。特别关注了Set的唯一性和NaN处理,以及Map的键值对管理和有序性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

接着 << 深入理解 Vue 3 响应性原理 — Proxy >> 开始了解 WeakMap、Map、Set 函数

例子

这是每个函数,在new之后,在控制台中打印的结果
请添加图片描述
set函数里边存储的是,类似数值一样的集合
map里边存的有 key, 和 value,不同的是,key 是对象类型
weakMap 存储形式和 map 一样

Set 对象允许你存储任何类型的唯一值

特点:

  1. Set对象是值的集合
  2. 按照插入的顺序迭代它的元素
  3. Set中的元素只会出现一次,即Set中的元素是唯一的
  4. NaN和undefined都可以被存储在Set 中, 在Set中NaN之间被视为相同的值
    方法:
methodsNamedescriptionreturn
add向尾部添加一个元素Set对象
clear移除对象内的所有元素
delete移除set中与这个值相等的元素Boolean
entries无参数一个新的迭代器对象,键和键值相等
forEach遍历对象,可以提供this
has是否在与否Boolean
values无参数新的迭代器对象
keys与values方法相同新的迭代器对象

Map 对象保存键值对,并且能够记住键的原始插入顺序。

特点:

  1. 键的对比是基于 sameValueZero 算法
  2. NaN 是与 NaN 相等的, 剩下的按照 === 运算结果判断是否相等
  3. -0 与 0 是相等的(有兼容性)

Map

方法:

methodsNamedescriptionreturn
get传入key某个 Map 对象中的一个指定元素
clear移除对象内的所有元素
delete移除指定的元素Boolean
entries无参数一个新的迭代器对象
forEach遍历对象,可以提供this
has是否在与否Boolean
values无参数新的value值迭代器对象
keys与values方法相同新的key值的迭代器对象
set添加或更新一个指定了键(key)和值(value)的(新)键值对(key, value)Map对象

与Object 区别:

类型MapObject
意外的键默认不包含任何键原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。
键的类型一个 Map的键可以是任意值,包括函数、对象或任意基本类型。必须是一个 String 或是Symbol。
键的顺序Map 中的 key 是有序的键是无序的
Size通过size 属性获取键值对个数键值对个数只能手动计算
迭代可以直接被迭代需要以某种方式获取它的键然后才能迭代
性能在频繁增删键值对的场景下表现更好在频繁添加和删除键值对的场景下未作出优化

WeakMap 对象是一组键/值对的集合,其中的键是弱引用的

特点:

  1. 键必须是对象,值是任意的 !!!
  2. key不能被枚举
  3. 如果没有其他引用存在,垃圾回收能正确的进行

方法: get, set, delete, has

const grpFilters = [...new Set(fcStatus.value.map(item => item.GRP))].map(value => ({ text: value, value })) 在运行此行语句时出现了如下的报错: ERROR Cannot read properties of null (reading &#39;map&#39;) TypeError: Cannot read properties of null (reading &#39;map&#39;) at setup (webpack-internal:///./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./src/views/FcStatusView.vue?vue&type=script&lang=js:46:51) at callWithErrorHandling (webpack-internal:///./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js:387:19) at setupStatefulComponent (webpack-internal:///./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js:7161:25) at setupComponent (webpack-internal:///./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js:7122:36) at mountComponent (webpack-internal:///./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js:4835:7) at processComponent (webpack-internal:///./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js:4813:9) at patch (webpack-internal:///./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js:4488:11) at ReactiveEffect.componentUpdateFn [as fn] (webpack-internal:///./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js:5011:9) at ReactiveEffect.run (webpack-internal:///./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js:323:19) at ReactiveEffect.runIfDirty (webpack-internal:///./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js:359:12) 应该如何解决?
03-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值