js之變量、數據、內存篇

內存:用於存放變量對象常量的物理空間。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(){
	......
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章