JS高階(2)—— 資料 變數 記憶體

小R.發表於2020-11-13

一、什麼是資料

  • 儲存於記憶體中代表特定資訊的“東西”, 本質就是0101二進位制
  • 具有可讀和可傳遞的基本特性
  • 萬物(一切)皆資料,函式也是資料
  • 程式中所有操作的目標:資料
    • 算術運算
    • 邏輯運算
    • 賦值
    • 呼叫函式傳參

二、什麼是記憶體

  • 記憶體條通電後產生的儲存空間(臨時的)
    • 產生和死亡: 記憶體條(積體電路板) —>通電—>產生一定容量的儲存空間—>儲存各種資料—>斷電—>記憶體全部消失
    • 記憶體的空間是臨時的,而硬碟的空間是持久的
    • 一塊記憶體包含2個資料
      • 內部儲存的資料(一般資料/地址資料)
      • 記憶體地址值資料
    • 記憶體分類
      • 棧:全域性變數, 區域性變數 (空間較小)
      • 堆:物件 (空間較大)

三、什麼是變數

  • 值可以變化的量,由變數名與變數值組成
  • 一個變數對應一塊小記憶體,變數名用來查詢到記憶體,變數值就是記憶體中儲存的內容

四、記憶體、資料、變數三者之間的關係

  • 記憶體是一個容器,用來儲存程式執行需要操作的資料
  • 變數是記憶體的標識,我們通過變數找到對應的記憶體, 進而操作(讀/寫)記憶體中的資料

五、問題:var a = xxx,a記憶體中到底儲存的是什麼?

  • xxx是基本資料, 儲存的就是這個資料
 var a = 3
  • xxx是物件, 儲存的是物件的地址值
var a = function () {

  }
  • xxx是一個變數,儲存的是xxx的記憶體內容(可能是基本資料,也可能是地址值)
var b = 'abc'
var a = b

六、關於引用變數賦值問題

  1. 2個引用變數指向同一個物件,通過一個變數修改物件內部資料,另一個變數看到的是修改之後的資料。
var obj1 = {name: 'Tom'}
var obj2 = obj1
obj2.age = 12
console.log(obj1.age)  // 12
function fn (obj) {
  obj.name = 'A'
}
fn(obj1)
console.log(obj2.name) //A

在這裡插入圖片描述

  1. 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

function fn2 (obj) {
	obj = {age: 15}
}
fn2(a)

console.log(a.age)  // 13

在這裡插入圖片描述

七、問題:在js呼叫函式時傳遞變數引數時, 是值傳遞還是引用傳遞

  • 只有值傳遞,沒有引用傳遞,傳遞的都是變數的值,只是這個值可能是基本資料,也可能是地址(引用)資料。
    • 如果後一種看成是引用傳遞,那就值傳遞和引用傳遞都可以有。
function f(a) {
	console.log(a)
}
var n = 4
f(n) //4  傳遞的是n的值 --->值傳遞
 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. 記憶體生命週期
    1). 分配需要的記憶體:分配小記憶體空間, 得到它的使用權
    2). 使用分配到的記憶體:儲存資料, 可以反覆進行操作
    3). 不需要時將其釋放 / 歸還:釋放小記憶體空間
  2. 釋放記憶體
    1). 區域性變數----為執行函式分配的棧空間記憶體:函式執行完自動釋放。
    2). 物件----儲存物件的堆空間記憶體:當記憶體沒有引用指向時,物件成為垃圾物件,垃圾回收器後面就會回收釋放此記憶體。

相關文章