前端學習(26)~js學習(四):基本數據類型vs引用數據類型

  • 2020 年 3 月 18 日
  • 筆記

在上一篇文章中,我們介紹過,變數有以下數據類型:

  • 基本數據類型(值類型):String 字元串、Number 數值、Boolean 布爾值、Null 空值、Undefined 未定義。
  • 引用數據類型(引用類型):Object 對象。

本文,我們針對這兩種類型,做進一步介紹。我們先來看個例子。

基本數據類型舉例:

    var a = 23;      var b = a;        a++;        console.log(a); // 列印結果:24      console.log(b); // 列印結果:23

上面的程式碼中:a 和 b 都是基本數據類型,讓 b 等於 a,然後改變 a 的值之後,發現 b 的值並沒有被改變。

但是在引用數據類型中,就不同了,我們來看一看。

引用數據類型舉例:

    var obj1 = new Object();      obj1.name = 'smyh';        // 讓 obj2 等於 obj1      var obj2 = obj1;        // 修改 obj1 的 name 屬性      obj1.name = 'vae';        console.log(obj1.name); // 列印結果:vae      console.log(obj2.name); // 列印結果:vae

上面的程式碼中:obj1 和 obj2 都是引用數據類型,讓 obj2 等於 obj1,然後修改 obj1.name 的值之後,發現 obj2.name 的值也發生了改變。

從上面的例子中,可以反映出,基本數據類型引用數據類型是有區別的。

那到底有什麼區別呢?我們進一步往下看。

棧記憶體和堆記憶體

我們首先記住一句話:JS中,所有的變數都是保存在棧記憶體中的。

然後來看看下面的區別。

基本數據類型:

基本數據類型的值,直接保存在棧記憶體中。值與值之間是獨立存在,修改一個變數不會影響其他的變數。

引用數據類型:

對象是保存到堆記憶體中的。每創建一個新的對象,就會在堆記憶體中開闢出一個新的空間,而變數保存了對象的記憶體地址對象的引用)。如果兩個變數保存了同一個對象的引用,當一個通過一個變數修改屬性時,另一個也會受到影響。