淺析前端的堆棧原理以及深淺拷貝原理

淺析前端的堆棧原理以及深淺拷貝原理
首先來看一個案例
const obj = {name:'hzw',age:18
}
let objName2 = obj
objName2.age = 12
console.log(obj,objName2) // {name: 'hzw', age: 12} {name: 'hzw', age: 12}
這里是不是很奇怪,為什么,為什么我改變objName2的值,第一個obj的值也發生了改變。
那么現在就有人說了,這淺拷貝嘛,有啥好難理解的
那又是為什么會造成這種情況呢,這個時候就必須對前端數據存儲的堆棧空間有所了解了,首先來說棧
棧:
第一點:我們必須要明白,前端的堆棧空間是怎么存儲的。
前端的簡單數據類型,都是存在一個棧內存中,不涉及指針
每次去新聲明一個簡單數據類型的變量,他都會新開一個棧地址,而新開的棧地址,與原變量是兩個沒有聯系的個體
所以你會發現,簡單數據類型不會存在有深淺拷貝的說法。
即衍生出了一個JSON.parse(JSON.stringify(xxx))對一個對象進行深拷貝的方法,原理后面再講
堆:
前面已經說了,前端JS的簡單數據類型,都是存在一個棧內存中
而JS中,他的引用數據類型的值,則是放在一個堆空間中,由指針去指向這個堆空間
下面給一張圖來對他進行一個解析
堆棧圖

在這里插入圖片描述

現在我們回到第一個案例
const obj = {name:'hzw',age:18
}
let objName2 = obj
objName2.age = 12
console.log(obj,objName2) // {name: 'hzw', age: 12} {name: 'hzw', age: 12}
為什么這個值發生變化了呢
因為第一個變量obj,它自己的指針,指向了堆空間中的值{name:'hzw',age:18
},
而第二個變量擁有了一個新的指針,但是這個指針指向的堆空間的值也是{name:'hzw',age:18
},
所以就出現了雖然他們的指針不同,但是所指向的堆空間都是同一個(共用了同一個堆空間)
所以當第二個的age發現了變化,第一個也會變
如下圖:

在這里插入圖片描述

而為什么這樣,obj的值又不會發生改變呢

const obj = {name:'hzw',age:18
}
let objName2 = JSON.parse(JSON.stringify(obj))
objName2.age = 12
console.log(obj,objName2) // {name: 'hzw', age: 18} {name: 'hzw', age: 12}
下面進行一個詳細的解析
`JSON.stringify(obj)` 將對象 `obj` 序列化為 JSON 字符串,他變成了一個簡單數據類型`JSON.parse(...)` 將這個 JSON 字符串重新解析為一個新的對象,從而產生了一個新的對象即他新開辟了一個堆空間,使的這兩個指針指向的并不是同一個堆空間,所以這個時候obj的值就不會發生改變
同時這個方法也不是萬能的,只能說滿足絕大多數的深拷貝需求
使用 JSON.parse(JSON.stringify(obj)) 進行深拷貝的方法有局限性:
1.  無法復制函數、正則表達式、Date 對象等特殊類型的屬性。
2.  會忽略 undefined 值。
3.  會忽略循環引用的情況。
##### 好了,通過這篇文章,是不是對JS中的堆棧類型以及深淺拷貝都有所了解呢。

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

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

相關文章

Hierarchical Text-ConditionalImage Generation with CLIP Latents筆記

1 Title Hierarchical Text-Conditional Image Generation with CLIP Latents(Aditya Ramesh、Prafulla Dhariwal、Alex Nichol、Casey Chu、Mark Chen) 2 Conclusion Contrastive models like CLIP have been shown to learn robust representations …

read()函數

read() 函數用于從文件描述符&#xff08;通常是套接字、文件等&#xff09;讀取數據。 #include <unistd.h>ssize_t read(int fd, void *buf, size_t count);fd&#xff1a; 是文件描述符&#xff0c;可以是套接字、文件等。 buf&#xff1a; 是一個指向要讀取數據的緩…

AirPods Pro 2 耳機推送新固件,蘋果Find My功能助力產品成長

蘋果公司面向 AirPods Pro 2&#xff08;包括 USB-C 和 Lightning 版本&#xff09;&#xff0c;推出了全新的測試版固件更新&#xff0c;版本號為 6E188&#xff0c;高于 12 月份發布的 6B34 固件。 蘋果和往常一樣&#xff0c;并沒有提供詳細的更新日志或者說明&#xff0c…

算法刷題day20:二分

目錄 引言概念一、借教室二、分巧克力三、管道四、技能升級五、冶煉金屬六、數的范圍七、最佳牛圍欄 引言 這幾天一直在做二分的題&#xff0c;都是上了難度的題目&#xff0c;本來以為自己的二分水平已經非常熟悉了&#xff0c;沒想到還是糊涂了一兩天才重新想清楚&#xff0…

力扣區間題:合并區間、插入區間

我們可以將區間按照左端點升序排列&#xff0c;然后遍歷區間進行合并操作。 我們先將第一個區間加入答案&#xff0c;然后依次考慮之后的每個區間&#xff1a; 如果答案數組中最后一個區間的右端點小于當前考慮區間的左端點&#xff0c;說明兩個區間不會重合&#xff0c;因此…

Java基于springboot的課程作業管理系統

摘 要 隨著科學技術的飛速發展&#xff0c;社會的方方面面、各行各業都在努力與現代的先進技術接軌&#xff0c;通過科技手段來提高自身的優勢&#xff0c;課程作業管理系統當然也不能排除在外。課程作業管理系統是以實際運用為開發背景&#xff0c;運用軟件工程原理和開發方法…

js跳出循環

只有for可以自己跳出循環 break可以退出多重循環&#xff0c;可以自行選擇退出哪一層 label: for (let i 0; i < arr.length; i) {if (arr[i].content) {break label}console.log(i) } label1: for (let i 0; i < arr.length; i) {label2: for (let j 0; j < arr.l…

Linux常見命令總結

1.創建文件夾 mkdir 目錄名 mkdir 文件夾名 創建單個文件夾 mkdir 文件夾1 文件夾2 文件夾3 創建多個文件夾 mkdir -p parent/child 創建多級文件夾 2.創建文件 touch 文件名 touch的主要功能有兩個,如果要創建的文件的名稱存在,將文件的創建時間修改到當前的系統時間(也…

五種常用的可視化項目管理工具

傳統的項目管理通常依賴于文本文檔&#xff0c;容易造成誤解和混亂。在快節奏的商業環境中&#xff0c;沒有哪個項目經理愿意處理繁重的文檔流程。 另一方面&#xff0c;可視化項目管理通常使用圖表和視覺板來展示復雜的項目信息。因此&#xff0c;項目經理能快速了解關鍵信息…

基于 rk3566 的 uboot 分析 - dts 加載和 dm 模型的本質

文章目錄 一、設備樹加載使用1、概述2、第一階段1) fdtdec_setup2) 總結 3、第二階段1) kernle dtb 編譯打包2) 加載流程2.1) board_init2.2) init_kernel_dtb2.3) rockchip_read_dtb_file2.4) rockchip_read_resource_dtb 3) 總結 二、dm 模型1、樹的創建1) device_bind_commo…

使用Matlab計算IGRAv2探空站的Tm和PWV

1. 探空站IGRAv2數據 探空站的Tm常作為真值&#xff0c;去檢驗Tm線性公式或者ERA5 Tm等的精度 。 探空站PWV常作為真值&#xff0c;去檢驗GNSS PWV等的精度 2. Tm 的計算方法 Tm 的計算方法有兩種在前面的文章有講&#xff0c;這里用 使用水汽壓和溫度計算Tm。 ei和 Ti 表示…

本地如何配置支付寶模擬支付場景并結合內網穿透實現公網環境調試開發?

文章目錄 前言1. 下載當面付demo2. 修改配置文件3. 打包成web服務4. 局域網測試5. 內網穿透6. 測試公網訪問7. 配置二級子域名8. 測試使用固定二級子域名訪問 前言 在沙箱環境調試支付SDK的時候&#xff0c;往往沙箱環境部署在本地&#xff0c;局限性大&#xff0c;在沙箱環境…

項目管理,如何做到流程標準化?

在項目管理的流程中&#xff0c;每個階段都有自己的起止范圍&#xff0c;有本階段的輸入文件和本階段要產生的輸出文件。 同時&#xff0c;每個階段都有本階段的控制關口&#xff0c;即本階段完成時將產生的重要文件也是進入下一階段的重要輸入文件。每個階段完成時一定要通過…

還在猶豫學不學?鴻蒙技術是否有前途的最強信號來了

2024年3月3日 上午10 點&#xff0c;深圳官方賬號發布了一篇關于鴻蒙技術發展的重要文章&#xff0c;看到這篇文章后我非常激動&#xff0c;忍不住和大家分享一下&#xff01; 華為鴻蒙系統自提出以來&#xff0c;網友們的態度各不相同&#xff0c;有嘲笑“安卓套殼”的&#…

2024 CHINASHOP丨悠絡客AI應用亮點搶鮮看,還有價值百元門票免費送哦!

3月13日-15日&#xff0c;備受國內外關注的第二十四屆中國零售業博覽會&#xff08;2024 CHINASHOP&#xff09;將在上海國家會展中心正式開展&#xff01;悠絡客作為深耕智慧門店15年的公有云人工智能企業&#xff0c;也將帶著全新AI產品和智慧門店解決方案亮相展會&#xff0…

Tomcat核心組件概述

Tomcat是一個免費的開放源代碼的Web應用服務器&#xff0c;屬于輕量級應用服務器&#xff0c;在中小型系統和并發訪問用戶不是很多的場合下被普遍使用&#xff0c;是開發和調試JSP程序的首選。Tomcat技術先進、性能穩定&#xff0c;而且免費&#xff0c;因而深受Java愛好者的喜…

Windows系統中ollama下載模型前設置下載路徑

Windows系統中ollama下載模型前設置下載路徑 一開始設置了用戶環境變量 OLLAMA_MODELS&#xff0c;沒有效果 添加系統環境變量后&#xff0c;ollama pull和run的模型都到了環境變量中的路徑下&#xff1b; 設置完后可以在cmd中檢查一下&#xff1a;echo %ollama_models% ollam…

PySide6實現注冊,登錄流程

目錄 一:實現思路 二:代碼實現 三:完整代碼和界面 一:實現思路 設計三個窗口界面,運行程序,打開注冊界面,填寫用戶名和密碼,信息填寫完整,校驗通過,插入數據庫。跳轉到登錄界面,輸入用戶名和密碼,校驗通過跳轉到主界面。

Electron 多顯示器渲染

Electron打出的包&#xff0c;如果當前有倆個顯示器&#xff0c;則可以配置當前顯示倒哪個顯示器上&#xff0c;或者可以配置不同的顯示器&#xff0c;啟動不同的項目&#xff0c;只在Windows和Linux下測試過&#xff0c;Mac沒有真機&#xff0c;可以利用docker安裝MacOS環境&a…

使用mapbox navigation搭建一個安卓導航 示例

一.代碼示例地址&#xff1a; https://github.com/mapbox/mapbox-navigation-android-examples/tree/main 二. 具體步驟&#xff1a; git clone gitgithub.com:mapbox/mapbox-navigation-android-examples.git Go to app/src/main/res/values Look for mapbox_access_token.…