總結
- 基礎類型(7 種):
number
,string
,boolean
,null
,undefined
,symbol
,bigint
- 引用類型(對象及其子類):
object
,array
,function
,date
,regexp
,map
,set
等
判斷方式推薦:
- 基礎類型:使用
typeof
- 引用類型:使用
instanceof
或Object.prototype.toString.call()
? 最佳實踐:使用
Object.prototype.toString.call(value)
實現最通用的類型判斷邏輯。
一、JavaScript 中的數據類型分類
JavaScript 的數據類型可以分為 基礎類型(Primitive Types) 和 引用類型(Reference Types)。
1. 基礎數據類型(Primitive Types)
類型 | 描述 |
---|---|
number | 表示數字,包括整數、浮點數,如 42 , 3.14 |
string | 表示字符串,如 "hello" |
boolean | 表示布爾值,只有 true 和 false |
null | 表示空值,常用于表示“無”或“空對象引用” |
undefined | 表示未定義的值,變量聲明但未賦值時為 undefined |
symbol | 表示唯一的、不可變的值,用于對象屬性的鍵 |
bigint | 表示任意精度的整數(ES2020 引入),如 123456789012345678901234567890n |
?? 注意:
typeof null
返回"object"
,這是一個歷史遺留的 bug。
2. 引用數據類型(Reference Types)
引用類型是對象(object
)的子類型,存儲的是對值的引用(內存地址)。
類型 | 描述 |
---|---|
object | 普通對象,如 { name: "Tom" } |
array | 數組對象,如 [1, 2, 3] |
function | 函數對象,如 function foo() {} |
date | 日期對象,如 new Date() |
regexp | 正則表達式對象,如 /^\d+/ |
map , set , weakmap , weakset | ES6 引入的集合類型 |
二、如何判斷數據類型?
1. typeof
運算符
適用于判斷基礎類型(除 null
外):
typeof 42; // "number"
typeof "hello"; // "string"
typeof true; // "boolean"
typeof undefined; // "undefined"
typeof Symbol(); // "symbol"
typeof 123n; // "bigint"
typeof null; // "object" ?(錯誤)
2. instanceof
運算符
用于判斷引用類型:
[] instanceof Array; // true
{} instanceof Object; // true
function() {} instanceof Function; // true
new Date() instanceof Date; // true
3. Object.prototype.toString.call()
適用于判斷所有類型,是最準確的方式:
Object.prototype.toString.call(42); // "[object Number]"
Object.prototype.toString.call("hello"); // "[object String]"
Object.prototype.toString.call(true); // "[object Boolean]"
Object.prototype.toString.call(null); // "[object Null]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(Symbol()); // "[object Symbol]"
Object.prototype.toString.call(123n); // "[object BigInt]"
Object.prototype.toString.call([]); // "[object Array]"
Object.prototype.toString.call(new Date()); // "[object Date]"
Object.prototype.toString.call(function () {}); // "[object Function]"
三、常見誤區與注意事項
問題 | 說明 |
---|---|
typeof null === "object" | 歷史 bug,應使用 === null 判斷 |
typeof [1,2,3] === "object" | 無法區分數組和其他對象,應使用 Array.isArray() |
NaN 的類型是 number | typeof NaN === "number" ,但它是非數值的 |
function 是對象,但 typeof 返回 "function" | 特殊處理 |