JS中的Map和WeakMap區別和聯系

JavaScript 中 MapWeakMap 的區別、聯系及示例


核心區別
特性MapWeakMap
鍵的類型允許任意類型的鍵(對象、原始值)鍵必須是對象(非原始值)
垃圾回收強引用鍵 → 阻止垃圾回收弱引用鍵 → 不影響垃圾回收
可遍歷性支持遍歷(keys(), values(), entries()不可遍歷(無遍歷方法)
Size 屬性size 屬性獲取鍵值對數量size 屬性
清除方法clear() 方法clear() 方法
性能頻繁增刪時內存占用較高內存優化(自動清理無引用鍵值對)

核心聯系
  1. 鍵值對存儲
    二者均為鍵值對集合:set(key, value) / get(key) / has(key) / delete(key)
  2. 鍵的唯一性
    鍵具有唯一性(引用不同的對象視為不同鍵)

代碼示例

1. Map 基本用法
const user = { id: 1 };
const settingsMap = new Map();// 添加任意類型鍵
settingsMap.set(user, { theme: "dark" });  // ? 對象鍵
settingsMap.set("language", "en");         // ? 字符串鍵console.log(settingsMap.size);           // 2
console.log(settingsMap.get(user));      // { theme: "dark" }// 遍歷Map
for (const [key, val] of settingsMap) {console.log(`${key}: ${JSON.stringify(val)}`);
}
2. WeakMap 基本用法
const user = { id: 1 };
const metadata = new WeakMap();metadata.set(user, { lastLogin: "2023-10-05" });  // ? 只允許對象鍵
// metadata.set("role", "admin");                 // ? TypeErrorconsole.log(metadata.has(user));     // true
console.log(metadata.get(user));     // { lastLogin: "2023-10-05" }// 當對象被銷毀時
user = null;  // 移除對user對象的引用// 垃圾回收后,WeakMap自動刪除對應鍵值對
// metadata.get(user) → undefined (無法直接驗證)

高級場景示例

場景 1:Map 的強引用問題
let data = { key: "value" };
const map = new Map();
map.set(data, 1);data = null;  // 移除引用// Map仍保留鍵值對 → 內存泄漏
console.log([...map.keys()]); // [{ key: "value" }] 
場景 2:WeakMap 解決內存泄漏
let data = { key: "value" };
const weakMap = new WeakMap();
weakMap.set(data, 1);data = null;  // 移除唯一引用// 垃圾回收后,weakMap自動清除鍵值對
// 無法直接檢查,但內存被釋放
場景 3:私有屬性模擬(WeakMap)
const privateStore = new WeakMap();class User {constructor(name) {// 每個實例關聯私有數據privateStore.set(this, { name });}getName() {return privateStore.get(this).name;}
}const alice = new User("Alice");
console.log(alice.getName());  // "Alice" // 外部無法訪問私有數據
console.log(alice.name);       // undefined

使用建議

場景推薦原因
需要遍歷鍵/值Map支持遍歷操作
存儲原始值作為鍵MapWeakMap 不支持原始值鍵
管理對象私有數據WeakMap避免內存泄漏,自動清理
臨時關聯對象與元數據WeakMap對象銷毀時自動解除關聯
緩存大量長期數據MapWeakMap 無大小控制和遍歷能力

核心總結:優先使用 Map 通用場景;選擇 WeakMap 需滿足 鍵是對象 + 需自動內存管理 兩大條件。

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

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

相關文章

Linux 環境 libpq加載異常導致psql 連接 PostgreSQL 庫失敗失敗案例

文章目錄局點現象定位結論局點環境補充知識點如下庫文件加載順序關鍵事實:您系統中的證據:優先級對比表:解決方案強化:最終檢查:本局點解決方法局點現象 數據庫 mdm 升級失敗檢查日志, 發現是由于 psql 連接數據庫報錯…

C# XML 文件

在 C# 中處理 XML 文件是非常常見的操作,可以使用System.Xml命名空間中的類來實現。以下是一些常用的 XML 操作示例: 手冊鏈接: System.Xml 命名空間 XmlDocument 創建一個xml數據格式的文檔 XmlDocument xml new XmlDocument(); Xml…

LOVON——面向足式Open-Vocabulary的物體導航:LLM做任務分解、YOLO11做目標檢測,最后L2MM將指令和視覺映射為動作(且解決動態模糊)

前言 因為項目需要(比如我們在做的兩個展廳講解訂單),近期我一直在研究VLN相關,有些工作哪怕暫時還沒開源(將來可能會開源),但也依然會解讀,比如好處之一是構建完整的VLN知識體系,本文便是其中一例 我在解讀過程中&am…

【Django】-3- 處理HTTP響應

HttpResponse 家族” 的常用操作🌟1. 設置狀態碼 👋狀態碼是服務器告訴客戶端 “請求處理結果” 的數字暗號(比如 404 表示 “沒找到頁面”)。Django 里有 3 種設置方式:方式 1:直接寫數字(簡單…

《React Router深解:復雜路由場景下的性能優化與導航流暢性構建》

路由系統是連接用戶操作與應用功能的中樞神經,而React Router作為React生態中處理路由邏輯的核心工具,其在復雜應用中的表現直接決定著用戶體驗的優劣。當應用規模擴張至數十甚至上百個路由,嵌套層級跨越多層,導航控制中的性能問題便會逐漸凸顯——從首屏加載的延遲到路由切…

網絡與信息安全有哪些崗位:(4)應急響應工程師

想知道網絡與信息安全領域有哪些具體崗位嗎? 網絡與信息安全有哪些崗位:(1)網絡安全工程師-CSDN博客 網絡與信息安全有哪些崗位:(2)滲透測試工程師_網絡安全滲透工程師-CSDN博客 網絡與信息安…

Leetcode 3634. Minimum Removals to Balance Array

Leetcode 3634. Minimum Removals to Balance Array 1. 解題思路2. 代碼實現 題目鏈接:3634. Minimum Removals to Balance Array 1. 解題思路 這一題思路上就是一個滑動窗口的思路。 我們首先將整個數組有序排列,然后分別從左向右考察每一個元素作為…

C#/.NET/.NET Core優秀項目和框架2025年7月簡報

前言 每月定期推廣和分享的C#/.NET/.NET Core優秀項目和框架(每周至少會推薦兩個優秀的項目和框架當然節假日除外),推文中有項目和框架的詳細介紹、功能特點、使用方式以及部分功能截圖等。注意:排名不分先后,都是十分…

第 10 篇:深度學習的“軍火庫”——CNN、RNN與Transformer,AI如何看懂世界?

《人工智能AI之機器學習基石》系列⑩ 專欄核心理念: 用通俗語言講清楚機器學習的核心原理,強調“洞察 + 技術理解 + 應用連接”,構建一個完整的、富有啟發性的知識體系。 引

深度學習—功能性函數代碼 common.py

函數:返回GPU def try_gpu(i0): #save"""如果存在,則返回gpu(i),否則返回cpu()"""if torch.cuda.device_count() > i 1: # 如果存在第 i 個 GPUreturn torch.device(fcuda:{i}) # 返回第 i 個 GPU 設…

南太平洋金融基建革命:斐濟-巴新交易所聯盟的技術破局之路 ——從關稅動蕩到離岸紅利,跨境科技如何重塑太平洋資本生態

一、今日焦點:全球關稅震蕩與南太平洋的“技術聯盟”機遇 1. 特朗普關稅大限引爆亞太市場波動,小經濟體承壓尋路 2025年8月1日,特朗普正式簽署行政令,對多國征收10%-41%的“對等關稅”。韓國首當其沖,綜合指數暴跌近4%…

python爬取豆瓣電影評論通用代碼

最近在自學python爬蟲,今天閑來無事,爬了一下豆瓣數據 這個網站對于初學者來說還是很友好的注意:有python環境的朋友運行的時候,要把cookie換成自己的 通用性:可以自己換不同的電影id進行數據爬取 Tip:slee…

構建屬于自己的第一個 MCP 服務器:初學者教程

為什么需要 MCP 服務器? 你是否遇到過這樣的場景:向 AI 助手(比如 GitHub Copilot)詢問 “北京今天的天氣”,得到的回復卻是 “我無法訪問實時天氣數據”? 這是因為大多數 AI 模型本身 “與世隔絕”—— 它…

個人項目介紹:語音識別小助手

一、項目內容 基于STM32F103RCT6制作了一款集語音識別、按鍵控制、信息顯示、溫濕度監測等多功能于一體的智能設備,滿足多樣化的交互需求。 二、個人工作內容 依據項目需求,選定 STM32F103RCT6 單片機、SU-03T語音識別模組、AHT25 溫濕度傳感器等核心元件…

【Django】-1- 開發項目搭建

一、PDM Django 搭建項目👇🎯 核心目標用 PDM(更現代的 Python 包管理工具),快速創建并管理 Django 項目(Web 框架),讓開發流程更絲滑?🧩 分步拆解1. 創建項目用 PDM 初…

c++:設計模式訓練

寫一個鳥類:有一個多態函數:run 寫一個企鵝類,繼承自鳥類:重寫 run 寫一個鴕鳥類,繼承自鳥類,重寫 run 寫一個老鷹類,繼承自鳥類,重寫run 寫一個鳥籠,能夠存放 不同的鳥…

配置Mybatis環境

配置Mybatis環境MyBatis是什么配置Mybatis環境MyBatis是什么 MyBatis 一個支持普通 SQL 查詢、存儲過程以及高級映射的持久層框架。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作,使得開發者可以更專注于 SQL 本身,而不必花費過多…

生產環境中基于Istio的Kubernetes多集群灰度發布架構實戰經驗分享

生產環境中基于Istio的Kubernetes多集群灰度發布架構實戰經驗分享 在大規模分布式微服務架構中,如何在多集群環境下平滑、安全地發布新版本,一直是保證高可用、高可靠的關鍵需求。本文以真實生產環境案例為基礎,分享我們團隊基于Istio Servic…

Kubernetes(k8s)之認識Pod

01了解Pod Pod是Kubernetes創建或部署的最小/最簡單的基本單位,一個Pod代表集群上正在運行的一個進程。 一個Pod封裝一個應用容器(也可以有多個容器),存儲資源、一個獨立的網絡IP以及管理控制容器運行方式的策略選項。它可能由單個容器或多個容器共享組成的資源。 Kubern…

Nginx服務做負載均衡網關

1. 概述 內部Nginx服務器做服務網關,代理后端應用服務,卸載ssl域名證書,將接收的https請求,轉發至后端http服務。華為防火墻負責NAT,啟用服務器負載均衡功能,將公網虛擬IP端口映射到內部多臺Nginx服務器上…