1. 程式人生 > 其它 >2. 變數的資料型別:基本資料型別和引用資料型別

2. 變數的資料型別:基本資料型別和引用資料型別

資料分類

資料分為:靜態資料、動態資料。

靜態資料

靜態資料是指一些永久性的資料。一般是以檔案的形式儲存在硬碟上,比如文件、照片、視訊等檔案。

電腦關閉後,靜態資料仍然還在。只要不主動刪掉資料或者硬碟沒損壞,這些資料就一直都在。

動態資料

動態資料是在程式執行過程中,動態產生的臨時資料,這些資料可能隨時發生變化。一般儲存在記憶體中。

電腦關閉後,這些資料會被清除。

為何不把應用程式的動態資料載入到硬碟中執行呢?這主要是因為,記憶體的訪問速度比硬碟快無數倍。

變數的資料型別

為什麼需要資料型別

在計算機中,不同的資料所需佔用的儲存空間不同,為了充分利用儲存空間,於是定義了不同的資料型別。而且,不同的資料型別,寓意也不同。

我們都知道,無論這個變數是字串型別,還是數字型別,我們都可以直接用 var 去定義它。比如:

var a = 'hello word';

var b = 123;

為什麼可以這樣做呢?這是因為:JavaScript 是一種「弱型別語言」,或者說是一種「動態語言」,這意味著不需要提前宣告變數的型別,在程式執行過程中,型別會自動被確定。

JS 的變數資料型別,是在程式執行的過程中,根據等號右邊的值來確定的。而且,變數的資料型別是可以變化的。比如說:

var name = 'qianguyihao';

name = 123; // 強制將變數 name 修改為 數字型別

JS 中一共有八種資料型別

  • 基本資料型別(值型別):String 字串、Number 數值、BigInt 大型數值、Boolean 布林值、Null 空值、Undefined 未定義、Symbol。

  • 引用資料型別(引用型別):Object 物件。

注意:內建物件 Function、Array、Date、RegExp、Error 等都是屬於 Object 型別。也就是說,除了那七種基本資料型別之外,其他的,都稱之為 Object 型別。

BigInt 和 Symbol 是ES6中新增的型別,我們留到以後再講。

面試問:引用資料型別有幾種?

面試答:只有一種,即 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 中,所有的變數都是儲存在棧記憶體中的。

然後來看看下面的區別。

基本資料型別

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

引用資料型別

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