寫在最前面:在javascript欄位下這是我即將開始寫的一個系列,主要是在框架橫行的時代,雖然上班用的是框架,但是對於面試,以及技術進階,JS基礎知識的鋪墊是錦上添花,也是不得不學習的一塊知識,雖然開汽車的不需要很懂汽車,只需要掌握汽車的常用功能即可。但是如果你懂車,那你也能更好地開車,同理。當然,一篇文章也不會光光只講一個知識點,一般會將有關聯的知識點串聯起來,一邊記錄自己的學習,一邊分享自己的學習,互勉!如果可以的話,也請給我按讚,你的讚也能讓我更努力地更新!
概覽
- 食用時間:6-12分鐘
- 難度:簡單,別跑,看完再走
JS記憶體生命週期
#分配記憶體
記憶體的讀與寫
#釋放記憶體
堆疊記憶體與堆疊記憶體
JS資料型別
在講棧記憶體與堆疊記憶體之前,大家應該都知道JS分為兩種資料型態:
-
基本資料型別
#String , Number , Boolean , null , undefined , Symbol (大小固定,體積輕量,相對簡單)
-
引用資料型別
#Object , Array , Function (大小不一定,佔用空間較大,相對複雜)
記憶體儲存機制
var a=true; //布尔型,基本数据类型var b='jack'; //字符型,基本数据类型var c=18; //数值型,基本数据类型var d={name:'jack'}; //对象,引用数据类型var d=[0,1,2,3,4,5]; //数组,引用数据类型复制代码
正是因為資料類型的不同,所以他們的存放方式也不同,就和現實生活中窮人和富人的住所完全不一樣(扯遠了)。我們先來看一張圖:

可以看到, a
, b
, c
都是基本資料類型, d
和e
都是引用資料類型,他們在存放方式上有著本質性的區別,基本資料類型的值是存放在堆疊記憶體中的,而引用資料型別的值是存放在堆疊記憶體中的,堆疊記憶體中僅存放著它在堆疊記憶體中的引用(即它在堆疊記憶體中的位址),就和它的名字一樣,引用資料型別
記憶體存取機制
上面講的是存儲,接下來說一下變數的訪問,基本資料型別可以直接從堆疊記憶體中存取變數的值,而引用資料型別要先從堆疊記憶體中找到它對應的參考位址,再拿著這個引用位址,去堆記憶體中查找,才能拿到變數的值
深淺拷貝
-
淺拷貝
上面已經和大家說過了基本資料型別跟引用資料型別在儲存上的不同,那麼,接下來說的這個深淺拷貝,想必大家也在面試題中常常碰到,老方式,先來看一段程式碼
var name='jack';var obj={ age:24};var nameCopy=name;var objCopy=obj; nameCopy='bob'; objCopy.age=15;console.log(name); //jackconsole.log(obj.age); //15复制代码
你會發現,
name
是沒有被影響的,而我們命名是修改objCopy.age
,為什麼還會影響到obj.age
呢,這就是因為深淺拷貝的問題在搗鬼,先來看下下面的一張圖

之所以會出現這種情況,是因為JS對於基本類型和引用類型的,當我們在複製引用類型的時候,複製的是該物件的引用地址,所以,在執行var objCopy=obj;
的時候,將obj
的引用地址複製給了objCopy
,所以,這兩個物件實際指向的是同一個對象,即改變objCopy
的同時也改變了obj
的值,我們將這種情況稱為淺拷貝,僅僅複製了物件的引用,並沒有開闢新的內存,拿人手短,拷貝地太淺了。 (只有引用型別才會出現淺拷貝的情況)
-
#深拷貝
再來看接下來的一段程式碼
var name='jack';var obj={ age:24};var nameCopy=name;var objCopy=JSON.parse(JSON.stringify(obj)); nameCopy='bob'; objCopy.age=15;console.log(name); //jackconsole.log(obj.age); //24复制代码
可以發現,在經過
JSON.parse(JSON.stringify(obj))
轉換了以後,淺拷貝不復存在,這一波是深拷貝,深拷貝開闢了新的堆內存地址,並且將對象的引用指向了新開闢的內存地址,和前面複製的對象完全獨立,自立根生,拷貝地很深,學功夫學到家,自立門戶的感覺。 -
另外实现深拷贝的方法(更多方式请自行百度)
var objCopy=Object.assign({},obj); //对象深拷贝的方法 Object.assign var arrayCopy=array.concat(); //数组深拷贝的方法 concat() (数组无嵌套对象或者数组可用) var arrayCopy=array.slice(); //数组深拷贝的方法 slice() (数组无嵌套对象或者数组可用) JSON.parse(JSON.stringify(array)) //顺带提下,JSON.parse(JSON.stringify()) 数组和对象通用复制代码
接着上面的数组容易踩坑的地方 ,来看一个例子
var array = [{name: 'jack'}, ['old']];var arrCopy = array.concat(); arrCopy[0].name='new';console.log(array); // [{name: 'new'}, ['old']]console.log(arrCopy); // [{name: 'new'}, ['old']]复制代码
可以清楚地看到(数组无嵌套对象或者数组可用的情况下用
concat
和slice
才有效)
系列目录
一张纸搞懂JS系列(1)之编译原理,作用域,作用域链,变量提升,暂时性死区
一张纸搞懂JS系列(2)之JS内存生命周期,栈内存与堆内存,深浅拷贝
一张纸搞懂JS系列(3)之垃圾回收机制,内存泄漏,闭包
更多相关免费学习推荐:javascript(视频)
以上是一張紙搞懂JS系列(2)之JS內存生命週期,棧內存與堆內存,深淺拷貝的詳細內容。更多資訊請關注PHP中文網其他相關文章!

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中