JavaScript 資料型別有七種,又分為原始型別及物件型別。
介紹
原始型別有六種:
- Boolean 布林,例如:true、false
- Null 空值
- Undefined 未定義
- Number 數字,例如:12345
- String 字串,例如:
'Hello World'
- Symbol(ES2015 新增) 符號
其他的都是物件型別:
- Object 物件,包含(物件 Object、陣列 Array、函式 Function、時間 Date…)
辨別方式
可以透過 typeof
來辨別型別
1 2 3 4 5 6 7 8 9 10 11 12 13
| console.log(typeof 1); console.log(typeof "2"); console.log(typeof true); console.log(typeof { a: 1 }); console.log(typeof [1, 2]); console.log(typeof new Date()); console.log(typeof undefined); console.log(typeof blabla);
console.log(typeof NaN); console.log(typeof function () {}); console.log(typeof null);
|
註:typeof null
是一個在 JavaScript 剛推出時就存在的 bug,因為擔心改動後會導致太多網站壞掉,所以目前及未來都沒有改的計畫。
仔細看會發現,確實像是時間、陣列都會被辨別為物件,雖然畢竟當初分類就是這麼分的,但在實務使用上還是有點不方便,因此其實有其他方式可以更準確地達到實務上的需求 ─ Object.prototype.toString.call(...)
。
1 2 3 4 5 6 7 8 9
| console.log(Object.prototype.toString.call(null)); console.log(Object.prototype.toString.call([1, 2])); console.log(Object.prototype.toString.call(new Date()));
console.log(Object.prototype.toString.call(NaN));
console.log(isNaN(NaN));
|
原始型別 VS 物件型別
可否更改原值
原始型別只能重新賦值,不能更改原值,比方說
1 2 3 4 5 6 7
| let str = "aa"; str.toUpperCase(); console.log(str);
let str = "aa"; str = str.toUpperCase(); console.log(str);
|
物件型別可以更改原值,比方說
1 2 3
| let arr = ["a", "b"]; arr.push("c"); console.log(arr);
|
變數存放方式
之所以會有這樣的差別,最大的差別就在於變數存放的方式。可以想像成變數名稱都是一張 memo 紙,而變數是一個箱子。
在原始型別當中,寫著變數名稱的 memo 紙貼著的箱子裡,放的就是變數的值,但在物件型別當中,寫著變數名稱的 memo 紙貼著的箱子裡,放的是一個記憶體位置,記憶體位置中放的才是變數的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| let str = "aa"; let arr = ["a", "b"];
let str = 1; let str1 = 1; console.log(str === str1);
let arr = [1, 2]; let arr1 = [1, 2]; console.log(arr === arr1);
let arr = [1, 2]; let arr1 = arr; console.log(arr === arr1);
let arr = [1, 2]; let arr1 = arr; arr1.push(3); console.log(arr); console.log(arr1);
let str = "aa"; let str1 = str; str1.toUpperCase(); console.log(str); console.log(str1);
let str = "aa"; let str1 = str; str1 = str1.toUpperCase(); console.log(str); console.log(str1);
|
綜合以上,我們會稱 ==物件型別是可變的 mutable,原始型別是不可變的 immutable==。
= 與 == 與 ===
=
:賦值
==
:兩邊進行比較,且會自動進行型別轉換
===
:兩邊進行比較,但不進行型別轉換
1 2 3 4 5 6 7 8 9 10 11
| let a = 1; console.log(a == "1"); console.log(a === "1");
if ((a = 2)) { console.log("a = 2"); } else { console.log("a = 1"); }
|
因此在比較時,永遠都是用 ===
最可靠。關於更多的 ==
與 ===
比較可參考這個 好懂表格。
另外,NaN
不大於、小於、等於任何數字或是 NaN
,NaN
與任何數字運算也都會變成 NaN
。
評論