前端筆記之vue中Map、Set之間的使用和區(qū)別詳析

一、基礎(chǔ)理論:數(shù)據(jù)結(jié)構(gòu)的本質(zhì)差異
1.1 Map:鍵值對(duì)

定義特性:Map是ES6引入的鍵值對(duì)集合,支持任意類(lèi)型作為鍵(包括對(duì)象、函數(shù)等),保持插入順序,提供O(1)時(shí)間復(fù)雜度的get/set/delete操作。
核心模型:
Key-Value模型:存儲(chǔ)
<K,V>結(jié)構(gòu),鍵唯一且不可直接修改迭代特性:通過(guò)
entries()返回鍵值對(duì)迭代器,支持forEach遍歷
數(shù)學(xué)表達(dá):Map可視為二元關(guān)系R={(k,v)|k∈K,v∈V},滿足函數(shù)定義f:K→V
1.2 Set:唯一值集合

定義特性:Set是唯一值集合,值自動(dòng)去重,保持插入順序,提供O(1)時(shí)間復(fù)雜度的add/has/delete操作。
核心模型:
純Key模型:存儲(chǔ)唯一值,可視為{v|v∈V}集合
等價(jià)關(guān)系:基于
Object.is的等價(jià)判斷,NaN視為相同值
拓?fù)涮匦?/strong>:Set空間滿足離散拓?fù)洌我鈨牲c(diǎn)不可連通
二、內(nèi)部實(shí)現(xiàn):哈希表與紅黑樹(shù)的博弈
2.1 哈希表實(shí)現(xiàn)(HashMap/HashSet)
底層結(jié)構(gòu):數(shù)組+鏈表/紅黑樹(shù),通過(guò)哈希函數(shù)映射存儲(chǔ)位置
沖突解決:
鏈地址法:哈希沖突時(shí)在鏈表尾部追加節(jié)點(diǎn)
紅黑樹(shù)化:鏈表長(zhǎng)度超過(guò)8時(shí)轉(zhuǎn)換為紅黑樹(shù)
擴(kuò)容機(jī)制:默認(rèn)初始容量16,負(fù)載因子0.75,擴(kuò)容時(shí)容量翻倍
2.2 紅黑樹(shù)實(shí)現(xiàn)(TreeMap/TreeSet)
數(shù)據(jù)結(jié)構(gòu):自平衡二叉查找樹(shù),滿足紅黑樹(shù)五條性質(zhì)
操作復(fù)雜度:插入、刪除、查找時(shí)間復(fù)雜度O(log n)
排序特性:按鍵/值的自然順序或自定義Comparator排序
三、與數(shù)組/對(duì)象的對(duì)比分析
數(shù)據(jù)結(jié)構(gòu) | 鍵類(lèi)型 | 順序性 | 迭代方式 | 典型用例 |
Map | 任意類(lèi)型 | 插入順序 | 鍵值對(duì)迭代 | 動(dòng)態(tài)屬性管理 |
Set | 值類(lèi)型 | 插入順序 | 值迭代 | 數(shù)據(jù)去重 |
數(shù)組 | 數(shù)字索引 | 索引順序 | 索引迭代 | 順序存儲(chǔ) |
對(duì)象 | 字符串/Symbol | 無(wú)序 | 鍵迭代 | 靜態(tài)屬性存儲(chǔ) |
性能對(duì)比:
查找操作:Map/Set O(1) vs 數(shù)組O(n) vs 對(duì)象O(1)
內(nèi)存占用:Map > Set > 數(shù)組 > 對(duì)象
四、Vue實(shí)戰(zhàn):響應(yīng)式數(shù)據(jù)管理
4.1 響應(yīng)式Map實(shí)現(xiàn)
import { reactive } from 'vue';
const state = reactive({
sessions: new Map([
[1, { active: true }],
[2, { active: false }]
])
});
// 動(dòng)態(tài)更新觸發(fā)響應(yīng)
state.sessions.set(3, { active: true });典型場(chǎng)景:
用戶會(huì)話管理(對(duì)象作為鍵)
API響應(yīng)緩存(避免重復(fù)請(qǐng)求)
操作日志記錄(保持插入順序)
4.2 響應(yīng)式Set實(shí)現(xiàn)
const selectedItems = reactive(new Set());
// 添加元素自動(dòng)去重
selectedItems.add('item1');
selectedItems.add('item1'); // 不會(huì)重復(fù)
// 檢查存在性
if (selectedItems.has('item1')) {
console.log('已選中');
}典型場(chǎng)景:
購(gòu)物車(chē)商品去重
權(quán)限控制快速檢查
表單多選值管理
五、高級(jí)特性:WeakMap與內(nèi)存管理
5.1 WeakMap特性
鍵弱引用:僅允許對(duì)象作為鍵,不影響垃圾回收
典型用例:
私有屬性存儲(chǔ)
DOM節(jié)點(diǎn)關(guān)聯(lián)數(shù)據(jù)
緩存臨時(shí)計(jì)算結(jié)果
5.2 內(nèi)存管理策略
內(nèi)存釋放:
刪除元素不立即釋放內(nèi)存,需容器銷(xiāo)毀或
shrink_to_fit()頻繁操作時(shí)注意內(nèi)存碎片問(wèn)題
性能優(yōu)化:
批量操作使用
for...of循環(huán)避免深度嵌套Map/Set
預(yù)分配初始容量
六、常見(jiàn)誤區(qū)與解決方案
6.1 誤區(qū):直接修改Map/Set元素
錯(cuò)誤示范:
const map = reactive(new Map()); map.get('key').name = 'new'; // 不會(huì)觸發(fā)更新正確方案:
// 方法1:重新set整個(gè)對(duì)象 map.set('key', { ...map.get('key'), name: 'new' }); // 方法2:使用Vue.set const obj = map.get('key'); Vue.set(obj, 'name', 'new'); map.set('key', obj);6.2 誤區(qū):Set中存儲(chǔ)對(duì)象引用
問(wèn)題表現(xiàn):
const set = new Set(); set.add({}); set.add({}); // size=2(不同引用)解決方案:
使用
JSON.stringify轉(zhuǎn)換后存儲(chǔ)改用Map存儲(chǔ)對(duì)象標(biāo)識(shí)符
七、性能對(duì)比:大數(shù)據(jù)量下的實(shí)證分析
測(cè)試環(huán)境:Chrome瀏覽器,100萬(wàn)條數(shù)據(jù)
操作
Set耗時(shí)
Map耗時(shí)
差異分析
插入
20-30ms
30-40ms
Map多鍵值對(duì)處理
查找
15-25ms
25-35ms
Map需額外哈希計(jì)算
內(nèi)存占用
80MB
160MB
Map存儲(chǔ)鍵值對(duì)
結(jié)論:
唯一值存儲(chǔ)選Set
鍵值對(duì)存儲(chǔ)選Map
大數(shù)據(jù)量注意內(nèi)存管理
結(jié)語(yǔ)
Map和Set是Vue開(kāi)發(fā)者處理復(fù)雜數(shù)據(jù)的兩把利器。理解它們的數(shù)學(xué)本質(zhì)、內(nèi)部實(shí)現(xiàn)和性能特性,結(jié)合Vue的響應(yīng)式系統(tǒng),能顯著提升開(kāi)發(fā)效率和代碼質(zhì)量。
記?。寒?dāng)需要鍵值對(duì)時(shí)選Map,當(dāng)需要唯一值集合時(shí)選Set,這個(gè)原則能解決90%的選擇難題。
到此這篇關(guān)于前端筆記之vue中Map、Set之間的使用和區(qū)別的文章就介紹到這了,更多相關(guān)vue中Map、Set使用和區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue中的Token過(guò)期驗(yàn)證與動(dòng)態(tài)路由重定向詳解
這篇文章主要為大家詳細(xì)介紹了如何在 Vue 項(xiàng)目中實(shí)現(xiàn) Token 過(guò)期驗(yàn)證,并根據(jù) Token 的有效期動(dòng)態(tài)重定向用戶到首頁(yè)或登錄頁(yè),感興趣的小伙伴可以了解下2025-03-03
vue2中vue.config.js簡(jiǎn)單配置代理跨域的方法
在前后端的開(kāi)發(fā)中總是難免會(huì)遇到前后端的跨域問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于vue2中vue.config.js簡(jiǎn)單配置代理跨域的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
vue+el-menu實(shí)現(xiàn)菜單欄無(wú)限多層級(jí)分類(lèi)
這篇文章主要為大家詳細(xì)介紹了vue+el-menu實(shí)現(xiàn)菜單欄無(wú)限多層級(jí)分類(lèi),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
Vue路由對(duì)象屬性 .meta $route.matched詳解
今天小編就為大家分享一篇Vue路由對(duì)象屬性 .meta $route.matched詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
解決vue使用vant下拉框van-dropdown-item 綁定title值不變問(wèn)題
這篇文章主要介紹了解決vue使用vant下拉框van-dropdown-item 綁定title值不變問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
vue列表數(shù)據(jù)發(fā)生變化指令沒(méi)有更新問(wèn)題及解決方法
這篇文章主要介紹了vue中使用指令,列表數(shù)據(jù)發(fā)生變化指令沒(méi)有更新問(wèn)題,本文給出了解決辦法,需要的朋友可以參考下2020-01-01
vue后臺(tái)管理如何配置動(dòng)態(tài)路由菜單
這篇文章主要介紹了vue后臺(tái)管理如何配置動(dòng)態(tài)路由菜單,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
Vue.js中Line第三方登錄api的實(shí)現(xiàn)代碼
這篇文章主要介紹了Vue.js中Line第三方登錄api實(shí)現(xiàn)代碼,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
vue-cli與webpack處理靜態(tài)資源的方法及webpack打包的坑
這篇文章主要介紹了vue-cli與webpack處理靜態(tài)資源的方法,需要的朋友可以參考下2018-05-05

