0%

JavaScript 基礎 型別篇

我們很容易忘記,我們曾學過的東西裡,仍有許多細微的小細節。

知道自己是個健忘的人,所以偶爾會翻些基礎的知識來看看,才發現其實有許多自己忘,或根本沒有去注意到的小細節。
這次來記錄一下自己之前學的時候沒注意到的點。

JavaScript 的資料類型

依照最新的 ECMAScript 標準定義了8種資料類型,這些資料類型又分為兩種:

  1. 基本(純值)類型 primitive values,也可說是原始型別
  • String
  • Number
  • Boolean
  • ndefined
  • null
  • Symbol
  • BigInt
  1. 物件(參考)類型 Object
  • Array:有索引/有序
  • function:可執行
  • object :任意物件
  • construction : 建構式產生的實體,也就是透過 new 關鍵自產生出的實體(實例)。

判斷資料類型的方式

  1. typeof : 可判斷 undefined/數值/字串/布林/function; 不能判斷 null 和 Object / Object 和 Array
    typeof 回傳時的資料類型是以字串表達,所以會有雙引號’number’,且都以小寫表示。

  2. Instanceof : 判斷物件具體的類型
    ex.物件是陣列還是函式等,instance of 的意思是實例。
    所以(a Instanceof b)即為 a 是不是 b 的實例。

基本型別的判斷:

1
2
3
4
5
6
7
undefinedtypeof instance === "undefined"
Booleantypeof instance === "boolean"
Numbertypeof instance === "number"
Stringtypeof instance === "string
BigInt:typeof instance === "bigint"
Symbol :typeof instance === "symbol"
null:typeof instance === "object"。

物件型別的判斷:

1
Objecttypeof instance === "object"

使用 typeof 判斷實作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const a = {
b: [1, 'hi', console.log],
c: function() {
return 'Hello';
}
};
console.log(a instanceof Object, a instanceof Array); // true false 型別以第一字母為大寫。
console.log(a.b instanceof Object, a.b instanceof Array); // true true
console.log(a.c instanceof Object, a.c instanceof Function); // true true 是物件也是函式的物件

consol.log(typeof a.b); // object 無法知道是array

// 用typeof時,比較時應該用字串型態
console.log(typeof a.c === 'function'); // true

// console.log 是什麼資料型態?
console.log(typeof a.b[2] === 'function'); // true

a.b[2](4); //4 ,a.b[2] 在這裏等同console.log()
a.c(); // 等同 a 物件裡的 function() { return 'Hello';}

  1. === 全等:比較運算子,可判斷 undefine 和 null

為什麼 null 是資料型態是 ‘object’ ?

覺得這樣的解釋還蠻有道理的,也就是說,當我們宣告一個物件或是字串形態的變數,他原本是個物件或陣列,型別皆為物件,但是如果我想要把這個變數整個在記憶體清掉,那麼我們就可以將null指向這個變數,這樣這個物件也會被清空。以這個方向來想,就不難理解為什麼 null的資料型態是'object'了。

undefined 和 null 的區別?

undefined 為宣告(定義)了變數,但還沒賦值。
null 宣告了,並已賦值,只是值是 null。

1
2
3
4
5
6
7
8
let a;
console.log(a); // undefined 宣告(定義)了但還沒賦值
a = null;
console.log(a); // null

let b = null; // 初始賦值為 null,表示將要賦值的物件 object
b = [1, 2, 3]; // 確定對物件 object 賦值
b = null; // 這個 object 被清空

何時會需要將 null 指向變數?

在初始變數時,將要賦值給變數的資料是物件 Object,但還沒有資料。
還有就是在結束前希望指向變數能成為回收物件。
簡單來說,回收就是釋放記憶體的意思,且在瀏覽器的環境下。
想知道更多的「回收物件」可看JavaScript 中的垃圾回收 - 知乎

嚴格區別變數型別與資料型別

資料類型:基本型別和物件型別

  • 基本型別
  • 物件型別 -> 參考()型別

變數型別:基本型別和參考型別

  • 基本型別 : 保存的是基本型別的資料(值)
  • 參考型別 : 保存的是資料的記憶體位址
1
let c = {}; // c 指向的是記憶體位置

(待續…)