JavaScript數據結構

目錄

JavaScript數據結構

一、基礎數據結構

1. 數組(Array)

2. 對象(Object)

二、ES6+ 高級數據結構

1. Map

2. Set

3. WeakMap 與 WeakSet

三、類型化數組(Typed Arrays)

四、其他數據結構實現

1. 棧(Stack)

2. 隊列(Queue)

3. 鏈表(Linked List)

五、數據結構選擇指南

六、最佳實踐

JavaScript中的for循環

1. 傳統?for?循環

語法

示例

特點

2.?for...of?循環

語法

示例

特點

3.?for...in?循環

語法

示例

特點

4.?Array.prototype.forEach

語法

示例

特點

5. 性能與選擇指南

性能對比

如何選擇?

6. 常見陷阱

1. 修改數組長度

2. 閉包問題

3. 遍歷稀疏數組


JavaScript數據結構


一、基礎數據結構

1. 數組(Array)

  • 定義:有序元素集合,可存儲任意類型值。

  • 創建方式

    let arr1 = [1, "a", true];      // 字面量
    let arr2 = new Array(3);        // 創建長度3的空數組(慎用)
  • 核心方法

    • 增刪元素

      arr.push(4);        // 末尾添加 → [1, 2, 3, 4]
      arr.pop();          // 移除末尾 → [1, 2]
      arr.unshift(0);     // 開頭添加 → [0, 1, 2]
      arr.shift();        // 移除開頭 → [1, 2]
    • 操作數組

      arr.splice(1, 1, "x");  // 從索引1刪除1個元素,插入"x" → [1, "x", 3]
      arr.slice(1, 3);         // 截取索引1到3(不包含3)→ ["x", 3]
      arr.concat([4, 5]);      // 合并數組 → [1, 2, 3, 4, 5]
    • 迭代與轉換

      arr.map(x => x * 2);     // 映射新數組 → [2, 4, 6]
      arr.filter(x => x > 1);  // 過濾 → [2, 3]
      arr.reduce((sum, x) => sum + x, 0); // 累加 → 6
  • 注意事項

    • 稀疏數組:空位(如?new Array(3))可能引發意外行為。

    • 引用類型:數組賦值傳遞引用,需用?[...arr]?或?arr.slice()?克隆。


2. 對象(Object)

  • 定義:鍵值對集合,鍵為字符串或 Symbol。

  • 創建方式

    let obj1 = { name: "Alice", age: 25 }; // 字面量
    let obj2 = new Object();               // 構造函數
  • 核心操作

    • 增刪查改

      obj.email = "alice@example.com"; // 添加屬性
      delete obj.age;                  // 刪除屬性
      console.log("name" in obj);      // 檢查屬性是否存在 → true
    • 遍歷

      Object.keys(obj);    // 返回鍵數組 → ["name", "email"]
      Object.values(obj);  // 返回值數組 → ["Alice", "alice@example.com"]
      for (let key in obj) { console.log(key, obj[key]); } // 遍歷自身及原型鏈屬性
  • 注意事項

    • 原型污染:避免修改?Object.prototype

    • 鍵順序:ES6 后字符串鍵按插入順序保留,但數字鍵優先排序。


二、ES6+ 高級數據結構

1. Map

  • 特點

    • 鍵可以是任意類型(對象、函數等)。

    • 保持插入順序。

  • 核心方法

    let map = new Map();
    map.set("key", "value");    // 添加鍵值對
    map.get("key");             // 獲取值 → "value"
    map.has("key");             // 檢查存在 → true
    map.delete("key");          // 刪除鍵值對
    map.size;                   // 獲取條目數
  • 適用場景:需要復雜鍵或頻繁增刪鍵值對時,優于 Object。


2. Set

  • 特點:存儲唯一值,自動去重。

  • 核心方法

    let set = new Set();
    set.add(1);                 // 添加值
    set.add(2);
    set.has(1);                 // 檢查存在 → true
    set.delete(1);              // 刪除值
    set.size;                   // 獲取元素數量
  • 適用場景:去重、集合運算(并集、交集等)。


3. WeakMap 與 WeakSet

  • 特點

    • 弱引用:鍵必須是對象,不阻止垃圾回收。

    • 不可迭代:無?sizeclear()?或遍歷方法。

  • 使用場景

    • WeakMap:存儲對象關聯的私有數據或元數據。

      let wm = new WeakMap();
      let obj = {};
      wm.set(obj, "secret");
    • WeakSet:標記對象(如跟蹤已處理對象)。

      let ws = new WeakSet();
      ws.add(obj);

三、類型化數組(Typed Arrays)

用于處理二進制數據(如圖像、音頻),與?ArrayBuffer?配合使用。

  • 常見類型

    • Int8ArrayUint8Array(8位整數)

    • Int16ArrayFloat32Array?等。

  • 示例

    let buffer = new ArrayBuffer(16);      // 分配16字節內存
    let int32View = new Int32Array(buffer); // 32位整數視圖(4個元素)
    int32View[0] = 42;

四、其他數據結構實現

JavaScript 未內置,但可通過基礎結構模擬:

1. 棧(Stack)

  • 后進先出(LIFO),用數組實現:

    class Stack {constructor() { this.items = []; }push(element) { this.items.push(element); }pop() { return this.items.pop(); }peek() { return this.items[this.items.length - 1]; }
    }

2. 隊列(Queue)

  • 先進先出(FIFO)

    class Queue {constructor() { this.items = []; }enqueue(element) { this.items.push(element); }dequeue() { return this.items.shift(); } // 時間復雜度 O(n)
    }

3. 鏈表(Linked List)

  • 節點鏈接實現

    class Node {constructor(value) {this.value = value;this.next = null;}
    }
    class LinkedList {constructor() { this.head = null; }append(value) { /* 實現添加邏輯 */ }
    }

五、數據結構選擇指南

場景推薦數據結構理由
有序集合,需快速訪問索引數組(Array)索引操作時間復雜度 O(1)
鍵值對,鍵為字符串或 Symbol對象(Object)語法簡潔,查找速度快
鍵為任意類型,需維護插入順序Map支持復雜鍵,有序
存儲唯一值Set自動去重,集合運算高效
高頻增刪元素(如隊列)鏈表(自定義實現)避免數組?shift()?的 O(n) 復雜度
二進制數據處理類型化數組(Typed Array)內存高效,適合底層操作

六、最佳實踐

  1. 優先使用 ES6+ 數據結構:如?MapSet?替代傳統對象和數組,提升代碼可讀性。

  2. 注意引用類型副作用:克隆數據避免意外修改。

  3. 性能敏感場景優化:如用?Int32Array?替代普通數組處理大量數值。

  4. 垃圾回收考慮:使用?WeakMap/WeakSet?管理對象關聯數據,防止內存泄漏。


??

JavaScript中的for循環


1. 傳統?for?循環

最基礎的循環結構,通過明確的初始化條件迭代器控制循環。

語法

for (初始化; 條件; 迭代器) {// 循環體
}

示例

// 遍歷數組
const arr = [1, 2, 3];
for (let i = 0; i < arr.length; i++) {console.log(arr[i]); // 輸出 1, 2, 3
}// 倒序循環
for (let i = arr.length - 1; i >= 0; i--) {console.log(arr[i]); // 輸出 3, 2, 1
}

特點

  • 靈活控制:可自定義步長(如?i += 2)、跳過某次循環(continue)或提前退出(break)。

  • 性能優化:預存數組長度(如?let len = arr.length)避免重復計算。

  • 作用域:使用?let?聲明變量時,每次循環會創建新的塊級作用域。


2.?for...of?循環

遍歷可迭代對象(如數組、字符串、Map、Set、生成器等)的值。

語法

for (const value of iterable) {// 使用 value
}

示例

const arr = ['a', 'b', 'c'];
for (const val of arr) {console.log(val); // 輸出 'a', 'b', 'c'
}// 遍歷字符串
for (const char of 'Hello') {console.log(char); // 輸出 H, e, l, l, o
}

特點

  • 簡潔性:無需索引,直接獲取值。

  • 支持異步:可與?await?結合使用(需在?async?函數中)。

  • 不適用于普通對象:默認對象不可迭代(除非自行實現?Symbol.iterator)。


3.?for...in?循環

遍歷對象的可枚舉屬性(包括原型鏈上的屬性)。

語法

for (const key in object) {// 使用 key 訪問屬性值:object[key]
}

示例

const obj = { a: 1, b: 2 };
for (const key in obj) {console.log(key, obj[key]); // 輸出 a 1, b 2
}// 遍歷數組(不推薦!)
const arr = [1, 2, 3];
arr.foo = 'bar';
for (const key in arr) {console.log(key); // 輸出 0, 1, 2, 'foo'
}

特點

  • 遍歷對象屬性:適合處理鍵值對。

  • 可能遍歷原型鏈:需用?hasOwnProperty?過濾:

    for (const key in obj) {if (obj.hasOwnProperty(key)) {// 僅處理自身屬性}
    }
  • 不保證順序:現代引擎通常按屬性添加順序遍歷,但復雜場景可能不一致。


4.?Array.prototype.forEach

數組專用的高階函數,遍歷每個元素。

語法

array.forEach((value, index, array) => {// 循環體
});

示例

const arr = [1, 2, 3];
arr.forEach((value, index) => {console.log(index, value); // 輸出 0 1, 1 2, 2 3
});

特點

  • 不可中斷:無法使用?break?或?continue,需通過?return?跳過當前迭代。

  • 鏈式調用:可與其他數組方法(如?mapfilter)配合。

  • 異步陷阱:回調函數中的?await?不會暫停外層循環。


5. 性能與選擇指南

性能對比

  • 最快:傳統?for?循環(尤其預存長度時)。

  • 適中for...of(底層使用迭代器協議)。

  • 較慢forEach(函數調用開銷)。

如何選擇?

場景推薦方式
需要索引或復雜控制傳統?for?循環
遍歷數組值(無需索引)for...of
遍歷對象屬性for...in?+ 過濾
簡單數組操作forEach
處理稀疏數組傳統?for?+ 判空

6. 常見陷阱

1. 修改數組長度

const arr = [1, 2, 3];
for (let i = 0; i < arr.length; i++) {arr.pop(); // 可能導致無限循環或跳過元素
}

2. 閉包問題

for (var i = 0; i < 3; i++) {setTimeout(() => console.log(i)); // 輸出 3, 3, 3
}
// 解決:改用 let 或 IIFE

3. 遍歷稀疏數組

const arr = [1, , 3]; // 中間是空位
arr.forEach(v => console.log(v)); // 輸出 1, 3(跳過空位)
for (const v of arr) console.log(v); // 輸出 1, undefined, 3

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

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

相關文章

魔改chromium——基礎環境搭建

谷歌chromium環境要求詳細文檔 軟件和環境要求&#xff0c;必須安裝&#xff0c;硬性要求 系統環境&#xff1a;Windows 10&#xff0c;內存最小8GB&#xff0c;推薦16GB&#xff0c;NTFS格式磁盤最少100GB空間Git版本&#xff1a;安裝最新版本即可&#xff0c;Git桌面端下載…

電子文檔安全管理系統V6.0接口backup存在任意文件下載漏洞

免責聲明&#xff1a;本號提供的網絡安全信息僅供參考&#xff0c;不構成專業建議。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權&#xff0c;請及時與我聯系&#xff0c;我將盡快處理并刪除相關內容。 漏洞描述 電子文檔安全管理系統 V6.0 reso…

5.3 MVVM模型

一、MVVM的基本概念 MVVM的基本概念&#xff1a;Model、View、ViewModel 組件職責示例內容Model封裝業務數據User類&#xff0c;包含姓名、年齡屬性View負責UI呈現XAML界面&#xff0c;包含數據綁定ViewModel連接View和Model&#xff0c;處理視圖邏輯MainViewModel包含命令和…

python采集淘寶拍立淘按圖搜索API接口,json數據示例參考

以下是關于淘寶拍立淘按圖搜索API接口的詳細說明及JSON數據示例&#xff1a; 一、接口概述 淘寶拍立淘按圖搜索API接口是淘寶開放平臺提供的一項基于圖像識別技術的服務&#xff0c;允許開發者通過上傳商品圖片&#xff0c;獲取與圖片相似或相同的商品列表。該接口廣泛應用于…

每天學一個 Linux 命令(8):ls

大家好,歡迎來到《每天掌握一個Linux命令》系列。在這個系列中,我們將逐步學習并熟練掌握Linux命令,今天,我們要學習的命令是ls。 01 什么是ls命令 在Linux系統中,ls命令是“list”的縮寫,其英文全稱為“list directory contents”,即“列出目錄內容”。該命令非常實用…

00.【Linux系統編程】 Linux初識(云服務器設置CentOS并使用、Xshell鏈接云服務器)

目錄 一、華為云服務器免費體驗申請 二、Xshell遠程鏈接創建好的華為云服務器 2.1 下載Xshell 2.2 Xshell遠程連接華為云服務器 一、華為云服務器免費體驗申請 華為云官網 1. 進入華為云官網&#xff0c;最上面一欄點活動&#xff0c;并進入免費體驗中心。 2. 找到含有“…

arm非對齊訪問編譯器選項

gcc編譯選項&#xff1a; -munaligned-access gcc編譯選項&#xff1a; -mno-unaligned-access Enables (or disables) reading and writing of 16- and 32- bit values from addresses that are not 16- or 32- bit aligned. By default unaligned access is disabled for…

jmeter線程組高并發(詳細講解)

在 JMeter 中&#xff0c;線程組是測試計劃的核心組件&#xff0c;用于定義虛擬用戶&#xff08;線程&#xff09;的行為。線程組的屬性決定了測試的并發用戶數、加載速度、運行時間等。以下是線程組屬性的詳細講解&#xff1a; 1. 名稱&#xff08;Name&#xff09; 定義&…

vs2022中使用spdlog、C++日志

spdlog::set_level(spdlog::level::info); // 只顯示info及比info高級的信息&#xff0c;trace 和 debug 不顯示 參考&#xff1a;Windows10中使用VS2022和Cmake編譯構建C開源日志庫-spdlog-騰訊云開發者社區-騰訊云 spdlog C日志管理 | 快速上手教程 - 知乎 1.按照上述步驟…

SOME/IP-SD -- 協議英文原文講解10

前言 SOME/IP協議越來越多的用于汽車電子行業中&#xff0c;關于協議詳細完全的中文資料卻沒有&#xff0c;所以我將結合工作經驗并對照英文原版協議做一系列的文章。基本分三大塊&#xff1a; 1. SOME/IP協議講解 2. SOME/IP-SD協議講解 3. python/C舉例調試講解 5.1.5 Non…

STM32 ADC轉換完成回調函數詳解 HAL_ADC_ConvCpltCallback與HAL_ADC_ConvHalfCpltCallback

HAL_ADC_ConvCpltCallback 和 HAL_ADC_ConvHalfCpltCallback 是 STM32 HAL 庫中用于處理 ADC&#xff08;模數轉換器&#xff09;轉換完成事件的回調函數。它們分別在 ADC 轉換完成和轉換完成一半時被調用。以下是它們的詳細說明&#xff1a; 1. HAL_ADC_ConvCpltCallback 功能…

Android OpenGLES 360全景圖片渲染(球體內部)

概述 360度全景圖是一種虛擬現實技術&#xff0c;它通過對現實場景進行多角度拍攝后&#xff0c;利用計算機軟件將這些照片拼接成一個完整的全景圖像。這種技術能夠讓觀看者在虛擬環境中以交互的方式查看整個周圍環境&#xff0c;就好像他們真的站在那個位置一樣。在Android設備…

代碼隨想錄算法訓練營第三十二天 | 509.斐波那契數 70.爬樓梯 746.使用最小花費爬樓梯

509. 斐波那契數 題目鏈接&#xff1a;509. 斐波那契數 - 力扣&#xff08;LeetCode&#xff09; 文章講解&#xff1a;代碼隨想錄 視頻講解&#xff1a;手把手帶你入門動態規劃 | LeetCode&#xff1a;509.斐波那契數_嗶哩嗶哩_bilibili 思路&#xff1a;輸入&#xff1a;…

拼多多 anti-token unidbg 分析

聲明: 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 逆向分析 版本7.3-7.4 都試過加密沒什…

【工具】BioPred一個用于精準醫療中生物標志物分析的 R 軟件包

介紹 R 語言包 BioPred 提供了一系列用于精準醫療中的亞組分析和生物標志物分析的工具。它借助極端梯度提升&#xff08;XGBoost&#xff09;算法&#xff0c;并結合傾向得分加權和 A 學習方法&#xff0c;幫助優化個體化治療規則&#xff0c;從而簡化亞組識別過程。BioPred 還…

橫掃SQL面試——時間序列分組與合并(會話劃分)問題

橫掃SQL面試題 &#x1f4cc; 時間序列分組與合并問題 &#x1f4da; 橫掃SQL面試——時間序列分組與合并解析 &#x1f31f; 核心問題類型 時間序列分組&#xff08;Sessionization&#xff09; 處理具有時間維度的連續數據流&#xff0c;根據特定規則&#xff08;如時間間隔…

PCB鉆孔之多邊形孔分析

問題分析 在鉆孔過程中&#xff0c;鉆頭的運動可以分為兩部分&#xff1a; 公轉&#xff1a;鉆頭的軸線繞理想軸線&#xff08;鉆孔中心線&#xff09;做圓周運動。自轉&#xff1a;鉆頭繞自身軸線做旋轉運動。 由于公轉和自轉的疊加&#xff0c;鉆尖的運動軌跡會形成復雜的…

Android源碼之App啟動

目錄 App啟動概述 App啟動過程 App啟動過程圖 源碼概述 跨進程啟動 進程內啟動 下面以應用桌面Launcher啟動App的MainActivity來舉例&#xff1a; App啟動概述 首先&#xff0c;MainActivity是由Launcher組件來啟動的&#xff0c;而Launcher又是通過Activity管理服務Act…

指紋瀏覽器技術解析:如何實現多賬號安全運營與隱私保護

瀏覽器指紋的挑戰與需求 在數字化運營場景中&#xff0c;瀏覽器指紋技術被廣泛用于追蹤用戶行為。通過采集設備硬件參數&#xff08;如屏幕分辨率、操作系統&#xff09;、軟件配置&#xff08;如字體、插件&#xff09;及網絡特征&#xff08;如IP地址、時區&#xff09;&…

生活電子常識——cmd不能使用anaconda的python環境,導致輸入python打開應用商店

前言 電腦已經安裝了anaconda,從自帶的Anaconda Prompt (Anaconda3)中是可以識別python環境的&#xff0c;然而切換到cmd時&#xff0c;突然發現cmd中無法識別anaconda的python環境&#xff0c;竟然打開了應用商店讓我安裝Python&#xff0c;這當然是不對的。 解決 這是因為…