【為什么會有 map、weakmap 類型?】

為什么會有 map、weakmap 類型?

  • 傳統對象的局限性催生 Map?
    • 1. 鍵類型單一性?
    • 2. 有序性與迭代支持?
    • 3. 性能優化場景?
  • 內存管理需求催生 WeakMap?
    • 1.弱引用機制?
    • 2. 私有數據存儲?
    • 3. 規避循環引用問題?
  • 總結

傳統對象的局限性催生 Map?

1. 鍵類型單一性?

傳統對象(Object)的鍵只能是?字符串或 Symbol?,無法直接使用對象、函數等復雜類型作為鍵名。而 Map 允許?任意數據類型作為鍵?(包括對象、函數等),解決了鍵類型受限的問題?

// 傳統對象鍵名被強制轉為字符串 ?:ml-citation{ref="4" data="citationList"}
const objKey = { id: 1 };
const data = {};
data[objKey] = 'value'; // 鍵名實際存儲為 "[object Object]"
console.log(data['[object Object]']); // 輸出 "value"// Map 直接使用對象作為鍵 ?:ml-citation{ref="4,6" data="citationList"}
const map = new Map();
map.set(objKey, 'value');
console.log(map.get(objKey)); // 直接輸出 "value"

2. 有序性與迭代支持?

Map ?保持鍵值對的插入順序?,支持通過 forEach、for...of 等方法遍歷,且提供 size 屬性快速獲取鍵值對數量,彌補了傳統對象無法保證順序和統計大小的不足?

const map = new Map();
map.set('a', 1).set('b', 2);
for (const [key, val] of map) {console.log(key, val); // 輸出順序:a 1 → b 2
}

3. 性能優化場景?

在頻繁增刪鍵值對或需要大量非字符串鍵的場景下,Map 的性能優于傳統對象(尤其在處理對象鍵時)?。

內存管理需求催生 WeakMap?

1.弱引用機制?

WeakMap 的鍵必須是?對象?,且對鍵是?弱引用?(不阻止垃圾回收)。當鍵對象被外部代碼釋放后,WeakMap 會自動清理對應的鍵值對,避免內存泄漏?。

2. 私有數據存儲?

WeakMap 適合存儲與對象生命周期綁定的私有數據,例如 Vue3 中管理組件響應式數據?。

// 模擬 Vue3 響應式系統使用 WeakMap ?:ml-citation{ref="1" data="citationList"}
const reactiveMap = new WeakMap();
function createReactiveObject(target) {if (reactiveMap.has(target)) {return reactiveMap.get(target);}const proxy = new Proxy(target, { /* 處理邏輯 */ });reactiveMap.set(target, proxy);return proxy;
}
// 組件銷毀后,target 對象被回收,WeakMap 自動清理對應代理

3. 規避循環引用問題?

在復雜對象關聯場景中,WeakMap 的弱引用特性可避免因相互引用導致的內存無法回收問題?。

總結

在這里插入圖片描述

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

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

相關文章

SpringSecurity認證授權完整流程

SpringSecurity認證流程:loadUserByUsername()方法內部實現。 實現步驟: 構建一個自定義的service接口,實現SpringSecurity的UserDetailService接口。建一個service實現類,實現此loadUserByUsername方法。…

本地部署DeepSeek R1大數據模型知識庫

DeepSeek-V3 的綜合能力 DeepSeek-V3 在推理速度上相較歷史模型有了大幅提升。在目前大模型主流榜單中,DeepSeek-V3 在開源模型中位列榜首,與世界上最先進OpenAI 閉源模型不分伯仲。 1、下載Ollama運行大數據庫 Ollama支持 Llama 3.3, DeepSeek-R1, Phi-…

云端秘境:EC2的奇幻之旅

在一個神秘的云端世界里,流傳著一個傳說——只要掌握了 EC2(Elastic Compute Cloud) 的奧秘,就能召喚出強大的騎士軍團,在云端之上建造屬于自己的帝國。年輕的程序法師 艾倫(Allen),…

【javaEE】多線程(基礎)

1.????前言~🥳🎉🎉🎉 Hello, Hello~ 親愛的朋友們👋👋,這里是E綿綿呀????。 如果你喜歡這篇文章,請別吝嗇你的點贊????和收藏📖📖。如果你對我的…

一周學會Flask3 Python Web開發-WTForms表單驗證

鋒哥原創的Flask3 Python Web開發 Flask3視頻教程: 2025版 Flask3 Python web開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 我們可以通過WTForms表單類屬性的validators屬性來實現表單驗證。 常用的WTForms驗證器 驗證器說明DataRequired(messageNo…

STM32標準庫代碼詳解之GPIO

GPIO的初始化代碼如下: /*開啟時鐘*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //開啟GPIOA的時鐘,使用外設必須開啟/*GPIO初始化*/ GPIO_InitTypeDef GPIO_InitStructure; //定義結構體變量 GPIO_InitStructure.GPIO_Mode GPIO_Mo…

華為歐拉系統 Tomcat 安裝詳解

1. 安裝或確認安裝 Java Tomcat 需要 Java 環境(JDK 或 JRE)才能運行。如果系統尚未安裝 Java,可以使用以下命令安裝 OpenJDK: # 更新軟件包索引 yum update -y# 安裝 OpenJDK 21(可根據需求安裝其他版本,如 8、11、17 等) yum install -y java-21-openjdk java-21-op…

第六課:數據庫集成:MongoDB與Mongoose技術應用

本文詳細介紹了如何在Node.js應用程序中集成MongoDB數據庫,并使用Mongoose庫進行數據操作。我們將涵蓋MongoDB在Ubuntu 20系統中的安裝、Bash命令的CRUD操作、Mongoose數據建模(Schema/Model)、關聯查詢與聚合管道,以及實戰案例—…

大數據學習(56)-Impala

&&大數據學習&& 🔥系列專欄: 👑哲學語錄: 承認自己的無知,乃是開啟智慧的大門 💖如果覺得博主的文章還不錯的話,請點贊👍收藏??留言📝支持一下博主哦&#x1f91…

【C#】async與await介紹

1. 實例1 1.1 代碼 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp1 {class Program{static void Main(string[] args){Method1();Method2();Console.ReadKey();}public static…

【大模型基礎_毛玉仁】1.1 基于統計方法的語言模型

【大模型基礎_毛玉仁】1.1 基于統計方法的語言模型 1.語言模型基礎1.1 基于統計方法的語言模型1.1.1 n-grams 語言模型1.1.2 n-grams 的統計學原理 1.語言模型基礎 語言是概率的。語言模型(LanguageModels, LMs)旨在準確預測語言符號的概率。 將按照語…

JavaScript(最后一個元素的索引就是數組的長度減 1)array.length - 1

在不同的編程語言中,表示數組中最后一個元素的方法略有不同,但基本思路都是利用數組的長度或索引來實現。 以下是一些常見編程語言中獲取數組最后一個元素的方法: 1. JavaScript: 使用 array.length - 1 索引: 這是最常見和傳統的方法。Java…

SpringCloud中使用服務名調用場景總結

一 API Gateway 在 Spring Cloud API Gateway 中,通過使用 lb:// 前綴可以實現基于服務名的負載均衡路由。以下是具體的配置和使用方法: 1. 配置服務注冊與發現 確保你的服務已經注冊到服務注冊中心(如 Nacos 或 Eureka)。API …

7V 至 30V 的超寬 VIN 輸入范圍,轉換效率高達 96%的WD5030

WD5030 具備 7V 至 30V 的超寬 VIN 輸入范圍,這一特性使其能夠適應多種不同電壓等級的供電環境,無論是在工業設備中常見的較高電壓輸入,還是在一些便攜式設備經過初步升壓后的電壓,WD5030 都能輕松應對,極大地拓展了應…

深度學習模型Transformer核心組件—自注意力機制

第一章:人工智能之不同數據類型及其特點梳理 第二章:自然語言處理(NLP):文本向量化從文字到數字的原理 第三章:循環神經網絡RNN:理解 RNN的工作機制與應用場景(附代碼) 第四章:循環神經網絡RNN、LSTM以及GR…

利用Ollama+AnythingLLM+本地向量數據庫Milvus+本地DeepSeek大模型實現知識庫的搭建

1. Ollama的搭建 基本介紹 Ollama是一個支持在Windows、Linux和MacOS上本地運行大語言模型的工具。它允許用戶非常方便地運行和使用各種大語言模型,比如Qwen模型等。用戶只需一行命令就可以啟動模型。 Ollama 下載:https://ollama.com/download Ollama 官方主頁&a…

如何搭建個人靜態住宅IP:從零開始

你好!今天我們將一起探索如何從頭開始搭建個人靜態住宅IP。無論您是為了遠程辦公、在線教育還是游戲加速,靜態住宅IP都能帶給您更穩定的網絡體驗。 一、準備階段 1. 明確需求 首先,您需要清楚自己為什么需要靜態住宅IP。可能是為了實現遠程…

國產編輯器EverEdit - 安裝擴展功能的方式

1 擴展管理 1.1 應用場景 由于各行各業工作場景的不同,編輯器不可能為所有行業都定制功能,因此,對于一些特殊的行業應用場景,某些資深工程師可能已經做了一些擴展,并分享到了共享平臺,普通工程師可以安裝這…

CUDA計時函數:精確測量GPU代碼執行時間

在GPU編程中,精確測量代碼執行時間是性能優化的關鍵步驟。CUDA提供了專門的計時工具來幫助開發者準確獲取核函數(Kernel)、內存拷貝等操作的耗時。本文將詳細介紹CUDA計時函數的使用方法,并通過實例代碼演示如何高效測量GPU代碼的…

Go語言集成DeepSeek API和GoFly框架文本編輯器實現流式輸出和對話(GoFly快速開發框架)

說明 本文是GoFly快速開發框架集成Go語言調用 DeepSeek API 插件,實現流式輸出和對話功能。為了方便實現更多業務功能我們在Go服務端調用AI即DeepSeek接口,處理好業務后再用Gin框架實現流失流式輸出到前端,前端使用fetch請求接收到流式的mar…