內存:用於存放變量、對象、常量的物理空間。js中內存空間可分爲三種:棧(stack)、堆(heap)、池(一般歸類於棧中)。
->棧:存放變量,特點:先進後出,後進先出。例如:string、number、boolean、null、undefined
->堆:存放複雜對象,特點:不能被直接訪問,更不能直接操作堆空間,只能引用訪問、操作。釋放引用,會被瀏覽器自動垃圾回收,釋放內存空間。例如:object、function、array
->池:存放常量
內存釋放:先看下手動回收例子:
var a = 20; // 在內存中給數值變量分配空間
alert(a + 100); // 使用內存
var a = null; // 使用完畢之後,釋放內存空間,等待下一次自動垃圾回收處理
自動垃圾回收機制:定時間隔的找出哪些沒被使用的值,然後釋放其佔用的內存。所以要及時的清除無效的引用。
例如es6中的WeakMap
就是一個弱引用的map結構。不會干擾自動垃圾回收機制。
數據:儲存在內存中的信息。
數據類型:
->基本數據(值)類型:字符串(String)、數字(Number)、布爾(Boolean)、對空(Null)、未定義(Undefined)、Symbol
->複雜數據(引用)類型:對象(Object)、數組(Array)、函數(Function)
變量:儲存在棧中的內存空間。
變量聲明:var、let、const
->未聲明,賦值,自動創建全局變量
->未聲明,未賦值,直接使用會* 報錯 *
變量提升:一句話概括,只要var聲明的變量,都會聲明提前
。
注意:只針對非嚴格模式下有效,
提前原則:變量提前,值留原地。
->在任何地方未聲明的變量,直接賦值操作,不會聲明提前。
->var聲明的變量,無論是否設置始化值,全局下會聲明提前至全局,函數內會提前在函數塊的頂端。
<script>
console.log(a); //undefined
console.log(b); //undefined
console.log(c); //報錯,ReferenceError: c is not defined
// 先聲明,再賦值
var a;
a = 3;
// 聲明並初始化
var b = 4;
//未聲明,直接賦值
c = 5;
</script>
->let、const聲明的變量、常量,只存在於聲明的塊中,不會聲明提前,但會存在一個暫時性死區。
function do_something() {
console.log(bar); // undefined
console.log(foo); // ReferenceError: foo is not defined
var bar = 1;
let foo = 2;
}
let在同級塊作用域中,不允許重複聲明
,否則會報錯。
->函數的兩種方式:
//函數表達式,變量提前,函數留原地
var test= function(){
......
}
//函數聲明,整個函數進行聲明提前
function test(){
......
}