ES6 Map/WeakMap/Set/WeakSet 全解指南

一、設計思想與核心概念

1. 解決傳統結構的痛點

  • Object:鍵只能是字符串/Symbol、無序、無size屬性
  • Array:查找效率低(O(n))、無自動去重機制
  • 核心突破
    // 傳統方式 vs ES6方式
    const obj = { [{}]: 'value' };  // 鍵會被轉為"[object Object]"
    const map = new Map().set({}, '真實對象鍵');  // 保留原始鍵類型
    

2. 四大金剛特性對比

結構鍵類型值特性可迭代弱引用典型內存消耗(1w條)
Map任意類型任意數據???~2.4MB
WeakMap僅對象任意數據???~0.7MB
Set-唯一值???~1.8MB
WeakSet僅對象唯一對象???~0.5MB

二、實例方法與屬性詳解

1. Map 方法全表

方法/屬性語法示例時間復雜度說明
sizemap.sizeO(1)實時條目計數
set(key, value)map.set({id:1}, 'data')O(1)返回Map本身(可鏈式調用)
get(key)map.get('name')O(1)未找到返回undefined
has(key)map.has(NaN)O(1)返回布爾值
delete(key)map.delete(key)O(1)返回操作是否成功
clear()map.clear()O(n)清空所有條目
keys()for(const k of map.keys())O(n)返回鍵的迭代器
values()map.values()O(n)返回值的迭代器
entries()map.entries()O(n)返回[key, value]迭代器(默認)
forEach(callback)map.forEach((v,k)=>...)O(n)遍歷方法

2. WeakMap 特殊方法

const wm = new WeakMap();
const obj = {};// 僅三個方法可用
wm.set(obj, 'private');  // ??
wm.get(obj);             // ??
wm.has(obj);             // ??
wm.delete(obj);          // ??// 以下操作均不支持
wm.size;     // ? undefined
wm.clear();  // ? 方法不存在
wm.keys();   // ? 不可迭代

3. Set 核心方法

方法/屬性示例說明
add(value)set.add(100).add(200)鏈式調用,自動去重
delete(value)set.delete(NaN)返回操作結果
has(value)set.has('test')存在性檢測
entries()set.entries()返回[value, value]迭代器

4. WeakSet 方法限制

const ws = new WeakSet();
const obj = {};ws.add(obj);    // ?? 僅對象
ws.has(obj);    // ??
ws.delete(obj); // ??ws.add('str');  // ? TypeError
ws.size;        // ? undefined

三、使用場景與技巧

1. Map 最佳實踐

場景1:DOM節點元數據存儲

const nodeMap = new Map();function handleClick(node) {if (!nodeMap.has(node)) {nodeMap.set(node, {clickCount: 0,lastClick: null});}const meta = nodeMap.get(node);meta.clickCount++;meta.lastClick = Date.now();
}

場景2:配置優先級隊列

class PriorityQueue {constructor() {this.map = new Map([[1, []], [2, []], [3, []]]);}add(item, priority) {this.map.get(priority).push(item);}process() {for (const [level, tasks] of this.map) {while(tasks.length) {this.execute(tasks.shift());}}}
}

2. WeakMap 高級用法

實現真正私有屬性

const privateStore = new WeakMap();class BankAccount {constructor(balance) {privateStore.set(this, {balance: balance,transactions: []});}deposit(amount) {const data = privateStore.get(this);data.balance += amount;data.transactions.push({ type: 'deposit', amount });}get balance() {return privateStore.get(this).balance;}
}

深度克隆輔助

function deepClone(obj, map = new WeakMap()) {if (obj === null || typeof obj !== 'object') return obj;if (map.has(obj)) return map.get(obj);const clone = Array.isArray(obj) ? [] : {};map.set(obj, clone);for (const key in obj) {if (obj.hasOwnProperty(key)) {clone[key] = deepClone(obj[key], map);}}return clone;
}

3. Set 實戰技巧

場景:用戶權限校驗

const ADMIN = Symbol('admin');
const EDITOR = Symbol('editor');const userPermissions = new Set([ADMIN, EDITOR]);function canDeleteContent(user) {return userPermissions.has(ADMIN);
}// 動態權限管理
function updatePermissions(user, perm) {userPermissions.add(perm);
}

高效數組去重

// 傳統方式 vs Set方式
const arr = [1,2,2,3,3,3];// O(n^2)
const uniqueArr = arr.filter((v,i) => arr.indexOf(v) === i);// O(n)
const setWay = [...new Set(arr)];

4. WeakSet 特殊應用

防止循環引用

const seen = new WeakSet();function safeStringify(obj) {if (typeof obj === 'object' && obj !== null) {if (seen.has(obj)) throw new Error('循環引用');seen.add(obj);}// ...序列化處理
}

四、性能優化策略

1. 基準測試對比(V8引擎)

操作Map(1e6次)Object(1e6次)差異
插入操作~120ms~95ms-17%
讀取操作~65ms~80ms+23%
刪除操作~110ms~450ms+309%
迭代操作~200ms~350ms+75%

優化建議

  • 大數據集(>10萬條):優先使用Map
  • 頻繁刪除:必須使用Map
  • 內存敏感:考慮WeakMap/WeakSet

2. 內存管理技巧

// 錯誤示范:內存泄漏
const cache = new Map();
function processData(data) {cache.set(data.id, data); // 長期持有引用,data無法被GC
}// 正確做法:WeakMap自動清理
const weakCache = new WeakMap();
function processObj(obj) {weakCache.set(obj, Date.now());
}

五、對比總結與決策矩陣

1. 四維對比表

特性MapWeakMapSetWeakSet
鍵類型AnyObject-Object
值唯一性NoNoYesYes
可序列化YesNoYesNo
垃圾回收強引用弱引用強引用弱引用
迭代能力FullNoneFullNone
典型內存占用較高較低中等最低

2. 場景決策樹

需要鍵值對存儲?
├─ 需要非對象鍵 → Map
├─ 需要內存優化 → WeakMap
└─ 需要簡單標記 → Set/WeakSet需要保證元素唯一?
├─ 基本類型 → Set
└─ 對象類型 → WeakSet數據生命周期?
├─ 長期存在 → Map/Set
└─ 臨時使用 → WeakMap/WeakSet

3. 綜合建議

  • 優先考慮Map:當需要鍵值對且不確定數據結構時
  • 內存敏感場景:使用Weak系列,如DOM節點關聯數據
  • 高性能去重:無腦選擇Set替代數組方案
  • 私有數據管理:WeakMap是最佳選擇

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78774.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78774.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78774.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法篇-----滑動窗口

1.概念 所謂的滑動窗口,就是我們之前的雙指針的一個擴展應用,在上一章中,我們的雙指針是相向而行的,而這里的雙指針是同向而行的,由于其移動過程中像一個窗口一樣來回滑動,時大時小,而且還會來…

1.1探索 LLaMA-Factory:大模型微調的一站式解決方案

探索 LLaMA-Factory:大模型微調的一站式解決方案 引言 在大模型的時代,微調技術是將預訓練模型適配到特定任務的關鍵。LLaMA-Factory 作為一款強大的工具,為開發者提供了便捷且高效的大模型微調解決方案。本文將深入介紹 LLaMA-Factory 的基…

神經網絡筆記 - 感知機

一 感知機是什么 感知機(Perceptron)是一種接收輸入信號并輸出結果的算法。 它根據輸入與權重的加權和是否超過某個閾值(threshold),來判斷輸出0還是1。 二.計算方式 感知機的基本公式如下: X1, X2 : …

Pygame事件處理詳解:鍵盤、鼠標與自定義事件

Pygame事件處理詳解:鍵盤、鼠標與自定義事件 在游戲開發中,玩家的交互是至關重要的。無論是移動角色、觸發動作還是暫停游戲,都需要通過各種輸入來實現。Pygame作為一個功能強大的Python庫,提供了豐富的API來處理這些輸入,包括鍵盤、鼠標以及自定義事件。本文將詳細介紹如…

使用 Python 項目管理工具 uv 快速創建 MCP 服務(Cherry Studio、Trae 添加 MCP 服務)

文章目錄 下載Traeuv 工具教程參考我的這篇文章創建 uv 項目main.pyCherry Studio 添加 MCP 服務申請 DeepSeek API配置 DeepSeek API調用 MCP 服務 Trae 添加 MCP 服務添加 MCP創建智能體 使用智能體調用 MCP 創建 demo 表查詢 demo 表結構信息demo 表插入 2 條測試數據查詢 d…

為什么要學習《金剛經》

《金剛經》作為佛教般若經典的核心,以"緣起性空"為思想根基,通過佛陀與須菩提的對話,揭示了破除執著、見真實相的智慧。 以下從核心要義、精髓段落和現實應用三個維度進行解讀: 一、核心思想精髓 1. "凡所有相&am…

【MQ篇】RabbitMQ之消費失敗重試!

目錄 引言:消息不丟是底線,失敗了優雅重試是修養!消費失敗了,為啥不能老是原地復活?🤔智能重試策略一:本地重試(Spring Retry 的魔法)🏠?智能重試策略二&…

制作一款打飛機游戲33:碰撞體編輯

我們設置系統的方式使得編輯碰撞檢測框(即碰撞盒)并不容易。所以,我們的下一步是擴展我們的編輯器,尤其是精靈編輯器,以便我們能夠在編輯器中直接編輯碰撞盒。 編輯碰撞盒 讓我們加載Sprite編輯器。例如,這…

Kotlin和JavaScript的對比

Kotlin和JavaScript有一些相似之處,但也存在顯著的差異,下面從多個方面為你詳細分析: 相似點 1. 語法靈活性 變量聲明:二者在變量聲明上都較為靈活。在JavaScript里,借助var、let和const可以聲明變量。其中&#xf…

生活需要一些思考

總分總 寫文章、做事情、寫郵件、寫信,都是要【總分總】。 先總【因為沒人有耐心一上來就看細節,先總結,別人感興趣才會看分】 然后分【分中包括多個子部分,或子章節、子目標,他們之間層層遞進,最終引出最…

JAVA設計模式——(九)工廠模式

JAVA設計模式——(九)工廠模式 介紹理解實現ProductFactory測試泛型擴展 應用 介紹 定義一個工廠類的接口,幫助一個實際對象 創建實例,并讓其工廠類的子類決定實例化哪個類。 理解 工廠模式中,必定分為了兩部分&…

Java后端接口調用攔截處理:注解與攔截器的實現

在Java開發中,對后端接口調用進行攔截處理是一種常見的需求,通常用于權限驗證、Token校驗、狀態更新等操作。本文將圍繞 Spring框架的攔截器(Interceptor)、Spring AOP(面向切面編程) 和 Spring Security 三…

第14講:科研圖表的導出與排版藝術——高質量 PDF、TIFF 輸出與投稿規范全攻略!

目錄 ?? 前言:導出,不只是“保存”! ?? 一、你需要掌握的導出目標 ??? 二、TIFF / PNG 導出規范(適用于投稿) ?? 三、PDF 矢量圖導出(排版首選) ?? 四、強烈推薦組合:showtext + Cairo ?? 五、多個圖的組合導出技巧 ?? 六、特殊投稿需求處理 ?…

對 FormCalc 語言支持較好的 PDF 編輯軟件綜述

FormCalc是一種專為PDF表單計算設計的腳本語言,主要應用于Adobe生態及SAP相關工具。以下是對FormCalc支持較好的主流軟件及其特點: 1. Adobe LiveCycle Designer 作為FormCalc的原生開發環境,LiveCycle Designer提供最佳支持: …

第二階段:基礎加強階段總體介紹

Java語法的學習筆記 下面放復習的文檔鏈接,如果有需要可以前往下載獲取,這個倉庫還有關于mysql、hadoop、python等的復習部分,并且每個文檔有著對應的代碼部分。文章作為復習使用,更多代碼內容見鏈接如下: https://gitee.com/zha…

大前端開發——前端知識漸變分層講解 利用金字塔原理簡化前端知識體系

Web開發基礎 核心概念 HTML、CSS和JavaScript:Web開發的三大基石,分別負責結構、樣式和行為。 代碼管理:隨著項目規模擴大,需要將代碼拆分成小塊,便于維護。 作用域污染:早期所有代碼共享全局作用域&…

Mixture-of-Experts(MoE)原理與在DeepSeek中的應用

MoE機制簡介 Mixture-of-Experts(MoE,混合專家)是一種“分而治之”的神經網絡架構思想。在MoE模型中,存在多個并行的子網絡,被稱為“專家”。每個專家通常擅長處理特定類型的輸入特征或知識片段。而在模型前向計算時,并非激活所有專家參與運算,而是通過一個專門的門控網…

SpringCloud學習筆記

個人學習進度:視頻跟敲筆記(12天) 學習視頻:尚硅谷微服務速通(7小時左右課程) 資源: 1.pdf:微服務pdf(課程):https://pan.baidu.com/s/1g_TAuBjQ…

【大模型】Coze AI 智能體工作流從配置到使用實戰詳解

目錄 一、前言 二、工作流介紹 2.1 什么是工作流 2.2 工作流與對話流 2.2.1 兩者區別 2.3 工作流節點介紹 2.3.1 工作流節點說明 2.3.2 開始節點與結束節點 2.4 工作流入口 2.4.1 自定義智能體入口 2.4.2 從資源庫新增工作流 2.5 工作流使用限制 三、工作流配置與使…

Discord多賬號注冊登錄:如何同時管理多個賬戶?

Discord是許多人、特別是游戲玩家和社區管理者的重要溝通工具。隨著用戶需求的增長,越來越多的人開始在Discord上注冊多個賬號進行管理。例如,個人和工作賬號的區分,多個游戲社區的參與,或者通過不同的身份進行更靈活的社交互動。…