JavaScript內存管理完全指南:從入門到精通

文章目錄

  • JavaScript內存管理完全指南:從入門到精通
      • 1. 哪些數據類型屬于引用類型(復雜數據類型)?
      • 2. 為什么引用類型要存儲在堆中?
      • 3. 引用類型的內存存儲示例
        • 示例 1:對象(Object)
        • 示例 2:數組(Array)
        • 示例 3:函數(Function)
      • 4. 基本數據類型 vs. 引用數據類型
      • 5. 特殊情況:`const` 聲明的引用類型
      • 總結

在這里插入圖片描述

JavaScript內存管理完全指南:從入門到精通

在 JavaScript 中,所有的復雜數據類型(引用類型)都遵循這個原則

  • 變量名(標識符)存儲在棧(Stack)中,并保存一個指向堆內存的引用地址(指針)
  • 實際的數據(如對象、數組、函數等)存儲在堆(Heap)中

1. 哪些數據類型屬于引用類型(復雜數據類型)?

JavaScript 中的引用類型包括:

  • Object(普通對象)
  • Array(數組)
  • Function(函數)
  • DateRegExpMapSet 等內置對象
  • 自定義的類實例

這些類型的數據都存儲在堆中,而變量名(引用)存儲在棧中。


2. 為什么引用類型要存儲在堆中?

  • 動態大小:引用類型(如對象、數組)的大小可能動態變化,堆內存可以靈活分配空間。
  • 共享數據:多個變量可以引用同一個堆數據(節省內存)。
  • 棧的限制
    • 棧內存較小,適合存儲固定大小的數據(如基本類型)。
    • 棧主要用于函數調用棧幀(局部變量、返回地址等),不適合存儲大塊數據。

3. 引用類型的內存存儲示例

示例 1:對象(Object)
let obj1 = { name: "Alice" }; // `obj1` 在棧中存儲堆的引用,對象數據在堆中
let obj2 = obj1;              // `obj2` 復制的是引用,指向同一個堆數據
obj2.name = "Bob";            // 修改會影響 `obj1`
console.log(obj1.name);       // "Bob"(因為 obj1 和 obj2 指向同一個堆數據)
示例 2:數組(Array)
let arr1 = [1, 2, 3]; // `arr1` 在棧中存儲堆的引用
let arr2 = arr1;      // `arr2` 復制的是引用
arr2.push(4);         // 修改會影響 `arr1`
console.log(arr1);    // [1, 2, 3, 4]
示例 3:函數(Function)
function greet() { console.log("Hello!"); }
let func1 = greet;    // `func1` 存儲的是函數的引用
let func2 = func1;    // `func2` 也指向同一個函數
func2();             // "Hello!"

4. 基本數據類型 vs. 引用數據類型

特性基本數據類型(Primitive)引用數據類型(Reference)
存儲位置變量名和值都在變量名(引用)在中,數據在
賦值方式值拷貝(復制值)引用拷貝(復制指針)
修改影響不影響其他變量多個變量可能指向同一數據,修改會互相影響
示例let a = 10;let obj = { x: 1 };

5. 特殊情況:const 聲明的引用類型

  • const 保證的是變量引用的地址不變,但堆中的數據仍然可以修改:
    const arr = [1, 2, 3];
    arr.push(4); // 允許(修改堆數據)
    arr = [5, 6]; // 報錯(不能修改引用地址)
    

總結

? 所有復雜數據類型(引用類型)都遵循:變量名在棧中存儲引用地址,實際數據在堆中。
? 基本數據類型(numberstring 等)直接存儲在棧中。
? 理解這一點對避免 “淺拷貝 vs. 深拷貝”“數據共享問題” 至關重要。

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

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

相關文章

Linux網絡-------3.應?層協議HTTP

1.HTTP協議 雖然我們說,應?層協議是我們程序猿??定的.但實際上,已經有?佬們定義了?些現成的,??常好?的應?層協議,供我們直接參考使?.HTTP(超?本傳輸協議)就是其中之?。 在互聯?世界中,HTTP(HyperText Transfer Protocol,超?本…

05 GWAS表型數據處理原理

表型數據處理 ? 質量性狀 – 二分類:可用0 / 1, 1 / 2 數值表示 – 多分類:啞變量賦值,0/1 ? 數量性狀 – 盡量符合正太分布 – 剔除異常表型值樣本 – 多年多點重復觀測 – 對于閾值性狀,分級數量化或啞變量賦值 R中 shapiro.t…

【Cpolar實現內網穿透】

Cpolar實現內網穿透業務需求第一步:準備工作1、關閉安全軟件2、下載所需軟件第二步:Nginx的配置第三步:使用cpolar實現內網穿透1、進入 https://dashboard.cpolar.com/get-started 注冊,登錄,完成身份證的實名認證2、下…

基于 JavaWeb+MySQL 的學院黨費繳費系統

基于 JavaWeb 的學院黨費繳費系統第 1 章緒論1.1 項目背景當今互聯網發展及其迅速,互聯網的便利性已經遍及到各行各業,惠及到每一個人,傳統的繳費方式都需要每個人前往繳費點陸續排隊繳費,不僅浪費大量了個人時間,而且…

LCGL基本使用

LVGC簡介 light video Graphics Library (1)純c與語言編程,將面向對象的思想植入c語言。 (2)輕量化圖形庫資源,人機交互效果好,在(ios Android QT)移植性較好,但是這些平臺對硬件要求較高 lcgc工程搭建 工程源碼的獲取 獲取工程結構 https://github.com/lvgl/lv_po…

嵌入式第十六課!!!結構體與共用體

一、結構體結構體是一種數據類型,它的形式是這樣的:struct 結構體名{ 結構體成員語句1;結構體成員語句2;結構體成員語句3;};舉個例子:struct Student {int id;char name[20];float score…

java web 實現簡單下載功能

java web 實現簡單下載功能 項目結構├── src\ │ ├── a.txt │ └── com\ │ └── demo\ │ └── web\ │ ├── Cookie\ │ ├── download\ │ ├── homework\ │ ├── serv…

虛幻基礎:模型穿模

能幫到你的話,就給個贊吧 😘 文章目錄模型穿模模型之間的阻擋是否正確設置模型是角色的組件:角色的組件不會與場景中其他的物體發生阻擋但可以發生重疊模型穿模 模型之間的阻擋是否正確設置 模型是角色的組件:角色的組件不會與場…

【Linux】linux基礎開發工具(二) 編譯器gcc/g++、動靜態庫感性認識、自動化構建-make/Makefile

文章目錄一、gcc/g介紹二、gcc編譯選項預處理編譯匯編鏈接三個細節三、動靜態庫感性認識動靜態庫的優缺點四、自動化構建-make/Makefile背景知識初步上手Makefilemakefile的推導過程makefile語法一、gcc/g介紹 我們之前介紹了編輯器vim,可以讓我們在linux上linux系統…

CentOS 7 上使用 Docker 安裝 Jenkins 完整教程

目錄 前言 準備工作 系統要求 檢查系統信息 更新系統 安裝Docker 第一步:卸載舊版本Docker(如果存在) 第二步:安裝必要的軟件包 第三步:添加Docker官方倉庫 第四步:安裝Docker CE 第五步:啟動Docker服務 第六步:驗證Docker安裝 第七步:配置Docker用戶權限…

30.【.NET8 實戰--孢子記賬--從單體到微服務--轉向微服務】--單體轉微服務--公共代碼--用戶上下文會話

在前面的文章中,我們會看到使用ContextSession來獲取當前用戶的UserId和UserName。這篇文章我們就一起來看看如何實現ContextSession。 一、ContextSession的實現 我們在公共類庫SP.Common中創建一個名為ContextSession的類,用于獲取當前請求的用戶信息。…

BaseDao

#### 10.1 DAO概念> DAO:Data Access Object,數據訪問對象。 > > Java是面向對象語言,數據在Java中通常以對象的形式存在。一張表對應一個實體類,一張表的操作對應一個DAO對象!>> 在Java操作數據庫時&a…

USRP捕獲手機/路由器數據傳輸信號波形(中)

目錄: USRP捕獲手機/路由器數據傳輸信號波形(上) USRP捕獲手機/路由器數據傳輸信號波形(中) USRP捕獲手機/路由器數據傳輸信號波形(下) 三、雙工通信信號捕獲 3.1 信號接收系統 5805e6Hz&a…

使用 Kiro AI IDE 3小時實現全棧應用Admin系統

Hello, 大家好,我是程序員海軍, 全棧開發 |AI愛好者 | 獨立開發。 之前我是采用Node生態開發的大模型以及MCP Server,大模型開發的生態主要是Python語言,為了更好的學習大模型開發,于是開了新坑。開始學習Python, 以及…

瀏覽器pdf、image顯示

瀏覽器地址欄 pdf data:application/pdf;base64, data:application/pdf;base64,JVBERi0xLjcKJeLjz9MKMjMgMCBvYmoKPDwv image data:image/jpeg;base64, data:image/jpeg;base64,/9j/4Q3fRXhpZgAATU0AKgAAAAgABwE

《Linux運維總結:銀河麒麟V10 SP3啟動docker容器報錯permission denied》

總結:整理不易,如果對你有幫助,可否點贊關注一下? 更多詳細內容請參考:Linux運維實戰總結 一、環境信息 二、背景 1、使用docker啟動一個nginx容器,報錯信息如下: docker: Error response from…

PDF源碼解析

PDF源碼解析打開PDF解析PDF?0. 文件頭關鍵信息解析技術原理圖解文件頭的重要性實際文件結構示例開發者注意事項歷史背景1. 根目錄整體結構關鍵字段解析核心概念解釋實際應用場景完整對象關系圖技術總結2. 頁面樹對象結構關鍵字段解析頁面樹工作原理技術要點總結實際應用3. 圖像…

java開閉原則 open-closed principle

基本知識 1.核心思想:面向抽象編程 2.基本內涵:對修改關閉,對擴展開放 3.要求:盡可能不修改源碼而是增加新功能 例子 以spring5核心原理與30個類手寫實戰中的為例 package com.gupaoedu.vip.design.principle.openclose;/*** Crea…

擁抱智慧物流時代:數字孿生技術的應用與前景

概述 在數字經濟全面推進的當下,物流行業正經歷著前所未有的智能化升級。作為新一代信息技術的重要代表,數字孿生技術正悄然改變著物流的運作方式和決策模式。所謂數字孿生,是指在虛擬空間中創建與現實物流系統高度一致的數字模型&#xff0…

libnest2d-頭文件分析-libnest2d.hpp-幾何類型-策略類型-參數配置

libnest2d 庫的主頭文件,定義了一個用于 二維不規則形狀自動排樣(Nesting) 的C接口。以下是詳細解析:1. 頭文件結構 (1) 防止重復包含 #ifndef LIBNEST2D_HPP #define LIBNEST2D_HPP // ... #endif // LIBNEST2D_HPP確保頭文件只被…