五分鐘讓你的JavaScript更進一步!

純潔的程式碼發表於2019-12-17
總所周知HTML(網頁的骨架),CSS(網頁的樣式)與JS並稱為前端三老鐵,其中JS被稱作前端的靈魂,
這就帶大家瞭解JavaScript最底層的原理,希望看完本篇,你能夠對對JavaScript有更深的瞭解!


JS全稱JavaScript,是屬於在瀏覽器端執行的一種客戶端的指令碼語言。其實,簡單來講JS就是用來操作DOM樹,改變它的結構或屬性。在客戶端的一些頁面效果可以使用JS來實現,不需要伺服器的響應,如果每個標籤等切換都需要與伺服器互動的話,伺服器的負荷會很大。或者頁面在進行某些操作後,需要與伺服器互動取得新資料,然後在頁面上有較小的變化,如果與伺服器互動渲染整個頁面的話會很慢,這時使用JavaScript的優勢就很明顯不過了,所以JS也變得越來越不可或缺!


JS的資料在記憶體中主要分成兩大類


棧:原始資料型別(Undefined,Null,Boolean,Number、String)


堆:引用資料型別(物件、陣列和函式)


在某些場景下,我們需要藉助堆疊資料結構來處理一些問題,所以下面我們要對這兩個資料結構進行區別。


五分鐘讓你的JavaScript更進一步!

區別:


兩種型別的儲存位置不同;


簡單資料型別直接儲存在棧中,佔據的空間小,主要定義變數(變數的儲存地址),Undefined,Null,Boolean,Number,String,
例如
它們是按值訪問的。


複雜資料型別儲存在堆中的物件,佔據的空間大,如果儲存在棧中,會影響程式的執行效能;JavaScript是不能直接訪問堆記憶體中的資料,所以如果我們要訪問複雜資料型別時,採用的是引用訪問,其實就是複雜資料型別在棧中儲存了指標,該指標指向堆中該型別的地址。


記憶體洩漏


很多人都知道,JS有垃圾回收機制,記憶體就可以不管了,在程式設計過程中會在全域性作用域下定義很多變數,以為JS會自動回收,其實不然,這些不再用到的記憶體沒有及時釋放,就會產生記憶體洩漏的問題。


關於垃圾回收機制:引自《JavaScript權威指南(第四版)》
  由於字串、物件和陣列沒有固定大小,所有當他們的大小已知時,才能對他們進行動態的儲存分配。JavaScript程式每次建立字串、陣列或物件時,直譯器都必須分配記憶體來儲存那個實體。只要像這樣動態地分配了記憶體,最終都要釋放這些記憶體以便他們能夠被再用,否則,JavaScript的直譯器將會消耗完系統中所有可用的記憶體,造成系統崩潰。
這段話解釋了為什麼需要系統垃圾回收。JavaScript的直譯器檢測到何時程式不再使用一個物件了,當他確定了一個物件是無用的時候,它就會把這個物件所佔用的記憶體釋放掉。
在區域性作用域的時候,如果函式執行完畢變數就沒有存在的必要,這是JavaScript的直譯器檢測並判斷,然後回收。但是對於全域性變數,沒發判斷什麼時候不用,所以我們應該減少全域性變數的使用。


相關文章