1. 程式人生 > 實用技巧 >2、資料、記憶體和變數

2、資料、記憶體和變數

  1. 什麼是資料?
  • 儲存在記憶體中代表特定資訊的'東東', 本質上是0101...
  • 資料的特點: 可傳遞, 可運算
  • 一切皆資料, 函式也是資料
  • 記憶體中所有操作的目標: 資料
    • 算術運算
    • 邏輯運算
    • 賦值
    • 執行函式

  1. 什麼是記憶體?
  • 記憶體條通電後產生的可儲存資料的空間(臨時的)
  • 記憶體產生和死亡: 記憶體條(電路版)>通電>產生記憶體空間>儲存資料>處理資料>斷電>記憶體空間和資料都消失
  • 一塊小記憶體的2個數據
    • 內部儲存的資料(一般資料/地址資料)
    • 地址值資料
  • 記憶體空間的分類
    • 棧: 全域性變數/區域性變數
    • 堆: 物件(空間較大)

  1. 什麼是變數?
  • 在程式執行過程中值是允許改變的量, 由變數名和變數值組成

  • 每個變數都對應的一塊小記憶體, 變數名用來查詢對應的記憶體, 變數值就是記憶體中儲存的資料

  • 資料, 記憶體和變數三者之間的關係

    • 記憶體是容器, 用來儲存不同資料
    • 變數是記憶體的標識, 通過變數我們可以操作(讀/寫)記憶體中的資料

  1. 相關問題
  • 關於賦值和記憶體的問題
    問題: var a = xxx, a記憶體中到底儲存的是什麼?
    • xxx是基本資料, 儲存的就是這個資料
    • xxx是物件, 儲存的是物件的地址值
    • xxx是一個變數, 儲存的xxx的記憶體內容(可能是基本資料, 也可能是地址值)
  • 關於引用變數賦值問題
    • 2個引用變數指向同一個物件, 通過一個變數修改物件內部資料, 另一個變數看到的是修改之後的資料
    var obj1 = {name: 'Tom'}
    function fn (obj) {
      obj.name = 'A' //操作物件
    }
    fn(obj1)
    console.log(obj2.name) //A
    
    • 2個引用變數指向同一個物件, 讓其中一個引用變數指向另一個物件, 另一引用變數依然指向前一個物件
    a = {name: 'BOB', age: 13}
    function fn2 (obj) {
      obj = {age: 15} //重新賦值
    }
    fn2(a)
    console.log(a.age) // 13
    
  • 關於資料傳遞問題
    問題: 在呼叫函式時傳遞變數引數時, 是值傳遞還是引用傳遞?
    • 理解1: 都是值(基本/地址值)傳遞
    • 理解2: 可能是值傳遞, 也可能是引用傳遞(地址值)
  • 記憶體管理
    問題: JS引擎如何管理記憶體?
    1. 記憶體生命週期
    • 分配小記憶體空間, 得到它的使用權
    • 儲存資料, 可以反覆進行操作
    • 不需要時將其釋放/歸還
    1. 釋放記憶體
    • 為執行函式分配的棧空間記憶體: 函式執行完 自動釋放
    • 儲存物件的堆空間記憶體: 成為垃圾物件==> 垃圾回收器回收