javascript的內存管理
Javascript 是那些被稱作垃圾回收語言當中的一員。垃圾回收語言通過周期性地檢查那些之前被分配出去的內存是否可以從應用的其他部分訪問來幫助開發者管理內存。換句話說,當計算機發現有的內存已經不能被訪問到了,就會把它們標記為垃圾。開發者只需要知道一塊已分配的內存是否會在將來被使用,而不可訪問的內存可以通過算法確定并標記以便返還給操作系統。
引用傳遞和值傳遞
js中的變量除了6個基本類型以外,其余的都是對象。也就說基本類型在賦值是傳遞的是值,也就是原來數據的一份拷貝。基本類型包括number、string、boolean、symbol、null、undefined.
用2個例子來理解一下:
值傳遞
var a = 10; //基本類型
var b = a; //a把10拷貝一份,把這個拷貝給b
a = 20; //修改了a,不影響a的拷貝
console.log(a); //20
console.log(b); //10
復制代碼
引用傳遞
var a = {num: 20}; //不是基本類型
var b = a; //這里沒有任何拷貝工作,b指向和a完全一致的同一塊內存
b.num = 15; //由于b和a指向同一塊內存,所以b.num修改了等同于a.num修改了
console.log(a.num); //15
console.log(b.num); //15//進一步理解
b = {age: 10}; //等號右邊定義了一個新的對象,產生的新的內存分配,此時b指向了這塊新的內存,a還是指向原來那塊內存
console.log(a); //{num: 15}
console.log(b); //{age: 10}
復制代碼
垃圾回收與內存泄漏
垃圾回收(Garbage Collection),簡稱GC。簡單來講,GC就是把內存中不需要的數據釋放了,這樣這部分內存就可以存放其他東西了。在javascript中,如果一個對象不再被引用,那么這個對象就會被GC回收。具體回收策略包括以下3種:
標記回收
當從window節點遍歷DOM樹不能遍歷到某個對象,那么這個對象就會被標記為沒用的對象。由于回收機制是周期性執行的,這樣,當下一個回收周期到來時,這個對象對應的內存就會被釋放。
引用計數
當系統中定義了一個對象后,對于這一塊內存,javascript會記錄有多少個引用指向個部分內存,如果這個數為零,則這部分內存會在下一個回收周期被釋放。
手動釋放
就好比上一個例子中,利用delete關鍵字刪除變量或屬性,達到釋放內存的目的。