JavaScript 基礎深入——資料、變數、記憶體
JavaScript 基礎深入——資料、變數、記憶體
什麼是資料?
- 儲存在記憶體中代表特定資訊的,本質上是0100101.....
- 資料的特點:可傳遞、可運算
- 一切皆資料
-
記憶體中所有操作的目標:資料
- 算術運算
- 邏輯運算
- 賦值運算
- 執行函式
什麼是記憶體?
- 記憶體條通電後產生的可儲存資料的空間(臨時的)
- 記憶體的產生和死亡:記憶體條(電路板)==>通電==>產生記憶體空間==>儲存資料==>處理資料==>斷電==>記憶體空間和資料都消失
-
一塊小記憶體的2個數據:
- 內部儲存的資料
- 地址值
-
記憶體分類:
- 棧:全域性變數 / 區域性變數
- 堆:物件
什麼是變數?
-
可變化的量:變數名和變數值組成
- 變數名
- 變數值
-
每個變數都對應一塊小記憶體:
- 變數名:用來查詢對應的記憶體,
- 變數值:就是記憶體中儲存的資料
記憶體、資料、變數三者之間的關係
- 記憶體是用來儲存資料的空間
- 變數是記憶體的標識
關於引用變數賦值的問題
- 2 個引用變數指向同一個物件,通過一個變數修改物件內部資料,另一個變數看到的就是修改後的資料。
- 2 個引用變數指向同一個物件,讓其中一個引用變數指向另一個物件,另一個變數依然指向前一個物件。
幾個易錯問題
問題1
var a = xxx
, a 記憶體中到底儲存的是什麼?
- xxx 是基本資料,a 記憶體中儲存的就是這個資料
- xxx 是物件,a 記憶體中儲存的是物件的地址值
- xxx 是一個變數,儲存 xxx 的記憶體內容(可能是基本資料,也可能是地址值)
問題2
在 js
呼叫函式時傳遞變數引數時,是值傳遞還是引用傳遞?
- 理解1:都是值(基本值/地址值)傳遞
- 理解2:可能是值傳遞,也可能是引用傳遞(地址值)
問題3
js
引擎如何管理記憶體?
-
記憶體生命週期
- 分配小記憶體空間,得到它的使用權
- 儲存資料,可以反覆進行操作
- 釋放小記憶體空間
-
釋放記憶體
- 區域性變數:函式執行完自動釋放
- 物件:成為垃圾物件==>垃圾回收器回收
var a = 3 var obj = {} obj = undefined function fn () { var b = {} } fn() // b是自動釋放, b所指向的物件是在後面的某個時刻由垃圾回收器回收