JavaScript 簡單類型與復雜類型-堆和棧

深入理解JavaScript中的簡單類型(基本數據類型)與復雜類型(引用數據類型)如何在內存中存儲對于編寫高效、無誤的代碼至關重要。本文將探討這兩種類型的差異,以及它們在內存中的存儲機制——棧(Stack)和堆(Heap),并通過實例說明這些概念的實際應用。

內存基礎:棧與堆

棧(Stack)

棧是一種后進先出(LIFO, Last In First Out)的數據結構,通常用于存儲函數調用信息和局部變量。由于其結構特性,棧操作非常快速且直接,訪問棧頂元素的時間復雜度為O(1)。

  • 特點
    • 存儲簡單類型值。
    • 每個線程擁有獨立的棧空間。
    • 固定大小,分配速度快。

堆(Heap)

堆是一種動態分配的內存區域,適合于存儲大小不固定的對象或需要長期存在的數據。與棧不同,堆上的數據沒有特定的順序,因此訪問速度較慢,但靈活性更高。

  • 特點
    • 存儲復雜類型值。
    • 所有線程共享同一塊堆內存。
    • 動態分配,管理相對復雜。

簡單類型 vs 復雜類型

簡單類型(基本數據類型)

JavaScript中有六種簡單類型:

  • undefined
  • null
  • boolean
  • number
  • string
  • symbol?(ES6新增)
特性
  • 按值傳遞:當簡單類型的值被作為參數傳遞給函數時,實際上是創建了一個副本,這意味著對參數的任何修改都不會影響原始值。

    function changeValue(x) {x = 10;
    }
    let a = 5;
    changeValue(a);
    console.log(a); // 輸出: 5
  • 存儲位置:簡單類型的值直接存儲在棧中,占用固定大小的空間。

復雜類型(引用數據類型)

常見的復雜類型包括:

  • Object
  • Array
  • Function
  • 其他自定義對象
特性
  • 按引用傳遞:當一個復雜類型的值被作為參數傳遞給函數時,傳遞的是該對象的引用地址而不是副本。因此,在函數內部對該對象所做的任何更改都會反映到原始對象上。

    function modifyObject(obj) {obj.name = "World";
    }
    let obj = { name: "Hello" };
    modifyObject(obj);
    console.log(obj.name); // 輸出: World
  • 存儲位置:復雜類型的值實際存儲在堆中,而棧中僅保存指向堆內存的引用地址。

實際案例分析

案例1:簡單類型的比較

let num1 = 10;
let num2 = 10;
console.log(num1 === num2); // 輸出: truelet str1 = "test";
let str2 = "test";
console.log(str1 === str2); // 輸出: true

在這個例子中,num1num2str1str2都存儲了相同的值,并且因為它們是簡單類型,所以比較結果為true

案例2:復雜類型的比較

let arr1 = [1, 2, 3];
let arr2 = [1, 2, 3];
console.log(arr1 === arr2); // 輸出: falselet obj1 = { key: "value" };
let obj2 = obj1;
console.log(obj1 === obj2); // 輸出: true

這里,arr1arr2雖然包含相同的內容,但由于它們是不同的對象實例,各自的引用地址不同,所以比較結果為false。而obj1obj2指向同一個對象,因此比較結果為true

案例3:淺拷貝 vs 深拷貝

由于復雜類型是按引用傳遞的,直接賦值不會復制對象本身,而是復制了引用。為了創建對象的獨立副本,我們需要使用深拷貝技術。

let original = { a: 1, b: { c: 2 } };
let shallowCopy = Object.assign({}, original);
let deepCopy = JSON.parse(JSON.stringify(original));original.b.c = 3;console.log(shallowCopy.b.c); // 輸出: 3
console.log(deepCopy.b.c);    // 輸出: 2

此示例展示了淺拷貝(shallowCopy)只復制了頂層屬性的引用,而深拷貝(deepCopy)則完全復制了整個對象樹。

總結

感謝您的閱讀!如果你有任何問題或想分享自己的經驗,請在評論區留言交流!

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

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

相關文章

騰訊SQL面試題解析:如何找出連續5天漲幅超過5%的股票

騰訊SQL面試題解析:如何找出連續5天漲幅超過5%的股票 作者:某七年數據開發工程師 | 2025年02月23日 關鍵詞:SQL窗口函數、連續問題、股票分析、騰訊面試題 一、問題背景與難點拆解 在股票量化分析場景中,"連續N天滿足條件"是高頻面試題類型。本題要求在單表stoc…

圖像處理、數據挖掘、數據呈現

目錄 圖像處理方法 閾值分割 圖像處理方法 圖像平滑 圖像銳化 圖像增強 閾值分割 邊緣檢測 閾值分割 特征提取 提取邊界 區域提取 主成分壓縮 POI 多源數據 數據挖掘 多源數據提取 關聯度提取 位置集群, 新聞事件, 權限 個人喜好 歷史…

嵌入式項目:STM32刷卡指紋智能門禁系統

本文詳細介紹基于STM32的刷卡指紋智能門禁系統。 獲取資料/指導答疑/技術交流/選題/幫助,請點鏈接: https://gitee.com/zengzhaorong/share_contact/blob/master/stm32.txt 1 系統功能 1.1 功能概述 本系統由STM32硬件端(下位機)…

計算機畢業設計 ——jspssm504springboot 職稱評審管理系統

作者:程序媛9688 開發技術:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等。 🌟文末獲取源碼數據庫🌟 感興趣的可以先收藏起來,還有大家在畢設選題(免費咨詢指導選題)&#xf…

安裝VM和Centos

安裝VM 一、打開虛擬機 二、選擇典型 三、選擇光盤 四、指定虛擬機位置 五、設置磁盤大小并拆分為多個文件 六、完成 安裝Centos 一、上述過程完成后我們直接打開虛擬機 二、語言選擇中文 三,默認安裝位置并點擊完成 四、點擊開始安裝 五、點擊設置密碼 等待安裝…

【AI應用】數字人涉及的一些主要 AI 技術

【AI論文解讀】【AI知識點】【AI小項目】【AI戰略思考】【AI日記】【讀書與思考】【AI應用】 在 數字人搭建 過程中,涉及多個 AI 技術,包括 訓練微調、算法、圖像合成、聲音克隆,每個部分都決定了最終效果的真實度、交互流暢度和個性化能力。…

【嘗試使用python調用Seismic unix】

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言一、代碼總結 前言 提示:這里可以添加本文要記錄的大概內容: 使用seismic unix嘗試建立界面,首先想到使用pyqt&#xff0c…

【安裝及調試舊版Chrome + 多版本環境測試全攻略】

👨💻 安裝及調試舊版Chrome 多版本環境測試全攻略 🌐 (新手友好版 | 覆蓋安裝/運行/調試全流程) 🕰? 【背景篇】為什么我們需要舊版瀏覽器測試? 🌍 🌐 瀏覽器世界的“…

2. EXCEL中函數和公式《AI賦能Excel》

歡迎來到滔滔講AI。今天我們來學習和討論下函數和公式是什么,以及它們之間的區別。 點擊圖片查看視頻 2、AI賦能EXCEL-函數和公式 一、什么是函數 首先,我們來了解一下函數。函數是Excel中預定義的計算工具,能夠幫助我們快速進行各種計算。 …

Python常見面試題的詳解16

1. 如何強行關閉客戶端和服務器之間的連接? 在網絡編程中,有時需要強行中斷客戶端和服務器之間的連接。對于基于 TCP 協議的連接,由于其面向連接的特性,需要采取特定的步驟來確保連接被正確關閉;而 UDP 是無連接協議&a…

【深度學習】矩陣的核心問題解析

一、基礎問題 1. 如何實現兩個矩陣的乘法? 問題描述:給定兩個矩陣 A A A和 B B B,編寫代碼實現矩陣乘法。 解法: 使用三重循環實現標準矩陣乘法。 或者使用 NumPy 的 dot 方法進行高效計算。 def matrix_multiply(A, B):m, n …

在CentOS 7下部署NFS的詳細教程

在CentOS 7下部署NFS的詳細教程 NFS(Network File System)是一種分布式文件系統協議,允許用戶在網絡中的不同主機之間共享文件和目錄。NFS廣泛應用于Linux和Unix系統中,特別適合在集群環境中共享存儲資源。本文將詳細介紹如何在C…

js中的await與async的使用

以下兩個方法,區別只在有沒有catch,使用的時候卻要注意 // 封裝請求方法,同步loading狀態出去 export const fetchWithLoading async (fn: Function, params: any, loading: Ref) > {loading.value true;try {return await fn(params);…

Ubuntu服務器 /data 盤需要手動掛載的解決方案

服務器 /data 盤需要手動掛載的解決方案 如果重啟服務器后,發現 /data 盤 沒有自動掛載,通常是因為: /etc/fstab 配置文件 沒有正確設置 自動掛載。該磁盤 沒有被正確識別,需要手動掛載。文件系統錯誤 導致掛載失敗。 下面是解…

輸入搜索、分組展示選項、下拉選取,全局跳轉頁,el-select 實現 —— 后端數據處理代碼,拋磚引玉展思路

詳細前端代碼寫于上一篇:輸入搜索、分組展示選項、下拉選取,el-select 實現:即輸入關鍵字檢索,返回分組選項,選取跳轉到相應內容頁 —— VUE項目-全局模糊檢索 【效果圖】:分組展示選項 >【去界面操作體…

【SpringBoot】_統一功能處理:統一數據返回格式

目錄 1. 對所有返回類型方法進行統一數據返回類型處理 2. 部分返回類型方法存在的問題 3. 對兩種有誤的方法進行處理 仍以圖書管理系統為例。 創建Result對后端返回給前端的數據進行封裝,增加業務狀態碼與錯誤信息,將原本的數據作為data部分&#xff…

智能交通系統(Intelligent Transportation Systems):智慧城市中的交通革新

智能交通系統(Intelligent Transportation Systems, ITS)是利用先進的信息技術、通信技術、傳感技術、計算機技術以及自動化技術等,來提升交通系統效率和安全性的一種交通管理方式。ITS通過收集和分析交通數據,智能化地調度、控制…

Unity百游修煉(1)——FootBall詳細制作全流程

一、引言 游玩測試: Football 游玩測試 1.項目背景與動機 背景:在學習 Unity 的過程中,希望通過實際項目來鞏固所學知識,同時出于對休閑小游戲的喜愛,決定開發一款簡單有趣的小游戲加深自己的所學知識點。 動機&#…

QQ登錄測試用例報告

QQ登錄測試用例思維導圖 一、安全性測試用例 1. 加密傳輸與存儲驗證 測試場景:輸入賬號密碼并提交登錄請求。預期結果:賬號密碼通過加密傳輸(如HTTPS)與存儲(如哈希加鹽),無明文暴露。 2. 二…

無人機實戰系列(三)本地攝像頭+遠程GPU轉換深度圖

這篇文章將結合之前寫的兩篇文章 無人機實戰系列(一)在局域網內傳輸數據 和 無人機實戰系列(二)本地攝像頭 Depth-Anything V2 實現了以下功能: 本地筆記本攝像頭發布圖像 遠程GPU實時處理(無回傳&#…