我們很容易忘記,我們曾學過的東西裡,仍有許多細微的小細節。
知道自己是個健忘的人,所以偶爾會翻些基礎的知識來看看,才發現其實有許多自己忘,或根本沒有去注意到的小細節。
這次來記錄一下自己之前學的時候沒注意到的點。
JavaScript 的資料類型
依照最新的 ECMAScript 標準定義了8種資料類型,這些資料類型又分為兩種:
- 基本(純值)類型 primitive values,也可說是原始型別
- String
- Number
- Boolean
- ndefined
- null
- Symbol
- BigInt
- 物件(參考)類型 Object
- Array:有索引/有序
- function:可執行
- object :任意物件
- construction : 建構式產生的實體,也就是透過 new 關鍵自產生出的實體(實例)。
判斷資料類型的方式
typeof : 可判斷 undefined/數值/字串/布林/function; 不能判斷 null 和 Object / Object 和 Array
typeof 回傳時的資料類型是以字串表達,所以會有雙引號’number’,且都以小寫表示。Instanceof : 判斷物件具體的類型
ex.物件是陣列還是函式等,instance of 的意思是實例。
所以(a Instanceof b)即為 a 是不是 b 的實例。
基本型別的判斷:
1 | undefined:typeof instance === "undefined" |
物件型別的判斷:
1 | Object:typeof instance === "object" |
使用 typeof 判斷實作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20const 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';}
- === 全等:比較運算子,可判斷 undefine 和 null
為什麼 null 是資料型態是 ‘object’ ?
覺得這樣的解釋還蠻有道理的,也就是說,當我們宣告一個物件或是字串形態的變數,他原本是個物件或陣列,型別皆為物件,但是如果我想要把這個變數整個在記憶體清掉,那麼我們就可以將null
指向這個變數,這樣這個物件也會被清空。以這個方向來想,就不難理解為什麼 null
的資料型態是'object'
了。
undefined 和 null 的區別?
undefined 為宣告(定義)了變數,但還沒賦值。
null 宣告了,並已賦值,只是值是 null。
1 | let a; |
何時會需要將 null 指向變數?
在初始變數時,將要賦值給變數的資料是物件 Object,但還沒有資料。
還有就是在結束前希望指向變數能成為回收物件。
簡單來說,回收就是釋放記憶體的意思,且在瀏覽器的環境下。
想知道更多的「回收物件」可看JavaScript 中的垃圾回收 - 知乎
嚴格區別變數型別與資料型別
資料類型:基本型別和物件型別
- 基本型別
- 物件型別 -> 參考()型別
變數型別:基本型別和參考型別
- 基本型別 : 保存的是基本型別的資料(值)
- 參考型別 : 保存的是資料的記憶體位址
1 | let c = {}; // c 指向的是記憶體位置 |
(待續…)