JavaScript數據,變量,內存 "摩擦"

數據,變量, 內存的理解

  • 什麼是數據?
    • 在內存中可讀的, 可傳遞的保存了特定信息的’東東’
    • 一切皆數據, 函數也是數據
    • 在內存中的所有操作的目標: 數據
    • 數據的特點: 可傳遞, 可運算
  • 什麼是變量?
    • 在程序運行過程中它的值是允許改變的量
    • 一個變量對應一塊小內存, 它的值保存在此內存中
  • 什麼是內存?
    • 內存條通電後產生的存儲空間(臨時的)
    • 一塊內存包含2個方面的數據
      • 內部存儲的數據
      • 地址值數據
    • 內存空間的分類
      • 棧空間: 全局變量和局部變量
      • 堆空間: 對象
  • 內存,數據, 變量三者之間的關係
    • 內存是容器, 用來存儲不同數據
    • 變量是內存的標識, 通過變量我們可以操作(讀/寫)內存中的數據

內存中存的是什麼?

var a = xxx, a內存中到底保存的是什麼?
  var a = 3
  a = function () {

  }

  var b = 'abc'
  a = b
  b = {}
  a = b
  • xxx是基本數據, 保存的就是這個數據
  • xxx是對象, 保存的是對象的地址值
  • xxx是一個變量, 保存的xxx的內存內容(可能是基本數據, 也可能是地址值)

關於引用變量賦值問題

  • 2個引用變量指向同一個對象, 通過一個變量修改對象內部數據, 另一個變量看到的是修改之後的數據
var obj1 = {name: 'Tom'}
console.log(obj1.name)  // Tom
var obj2 = obj1

obj2.name = 'Jachie'
console.log(obj1.name)  // Jachie

function fn (obj) {
obj.name = 'Jack'
}
fn(obj1)
console.log(obj2.name) // Jack
  • 2個引用變量指向同一個對象, 讓其中一個引用變量指向另一個對象, 另一引用變量依然指向前一個對象
  var a = {age: 12}
  var b = a
  a = {name: 'BOB', age: 13}
  b.age = 14
  console.log(b.age, a.name, a.age) // 14 Bob 13

在js調用函數時傳遞變量參數時, 是值傳遞還是引用傳遞

  • 理解1: 都是值(基本/地址值)傳遞
  • 理解2: 可能是值傳遞, 也可能是引用傳遞(地址值)
  var a = 3
  function fn (a) {
    a = a +1
  }
  fn(a)
  console.log(a) // 3

  function fn2 (obj) {
    console.log(obj.name)
  }
  var obj = {name: 'Tom'}
  fn2(obj) // Tom

JS引擎如何管理內存?

  1. 內存生命週期
    • 分配小內存空間, 得到它的使用權
    • 存儲數據, 可以反覆進行操作
    • 釋放小內存空間
  2. 釋放內存
    • 局部變量: 函數執行完自動釋放
    • 對象: 成爲垃圾對象==>垃圾回收器回收
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章