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

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

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

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

