JavaScript準確判斷數(shù)據(jù)類型的5 種方法深度對比
在寫js的時候,很容易因為數(shù)據(jù)類型沒判斷好而出錯,比如這樣的代碼:
function calculate(a, b) {
return a + b;
}
// 我以為是 10 + 20 = 30
calculate(10, 20); // 結(jié)果 30 對的
// 實際上用戶輸入的是字符串和數(shù)字
calculate("10", 20); // 結(jié)果為 "1020"
所以為了避免這種情況的出現(xiàn),我們還是要去判斷好數(shù)據(jù)類型。
在JavaScript中,有幾種方式來判斷數(shù)據(jù)類型,以下是常用的方法:
1. typeof 操作符
最常用的類型判斷方法,但有一些局限性:
typeof 42; // "number"
typeof "hello"; // "string"
typeof true; // "boolean"
typeof undefined; // "undefined"
typeof null; // "object" (歷史遺留問題)
typeof {}; // "object"
typeof []; // "object"
typeof function(){}; // "function"
typeof Symbol(); // "symbol"
typeof 42n; // "bigint"
局限性:
- 無法區(qū)分數(shù)組、對象和
null - 函數(shù)返回
function typeof適合判斷基本類型,但遇到對象類型就力不從心了
2. instanceof 操作符
用于檢測構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在對象的原型鏈中:
[] instanceof Array; // true
{} instanceof Object; // true
new Date() instanceof Date; // true
function(){} instanceof Function; // true
// 繼承關(guān)系,數(shù)組也是對象
[] instanceof Object; // true
instanceof 的局限性:
// 基本類型用不了 42 instanceof Number; // false "hello" instanceof String; // false
在跨 iframe 或不同 window 環(huán)境下可能失效(因為構(gòu)造函數(shù)不同)
3. Object.prototype .toString.call()
這是最準確、最可靠的方法,能識別所有內(nèi)置類型!
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([]); // "[object Array]"
Object.prototype.toString.call({}); // "[object Object]"
Object.prototype.toString.call(function(){}); // "[object Function]"
Object.prototype.toString.call(Symbol()); // "[object Symbol]"
Object.prototype.toString.call(42n); // "[object BigInt]"
我們封裝一個實用的工具函數(shù):
function getRealType(value) {
return Object.prototype.toString.call(value)
.slice(8, -1) // 截取"[object "和"]"之間的內(nèi)容
.toLowerCase(); // 轉(zhuǎn)為小寫,更友好
}
console.log(getRealType([])); // "array"
console.log(getRealType(null)); // "null"
console.log(getRealType({})); // "object"
console.log(getRealType(new Date())); // "date"
4. 專用方法
對于一些特殊類型,JavaScript提供了專門的判斷方法:
判斷數(shù)組:Array.isArray()
Array.isArray([]); // true
Array.isArray({}); // false
Array.isArray("123"); // false
判斷NaN:Number.isNaN()
// 注意區(qū)別!
isNaN("hello"); // true ← 字符串不是數(shù)字,但這樣判斷容易誤解
Number.isNaN("hello"); // false ← 更準確:只有真正的NaN才返回true
Number.isNaN(NaN); // true
判斷有限數(shù)字:Number.isFinite()
Number.isFinite(42); // true
Number.isFinite(Infinity); // false ← 無窮大不是有限數(shù)字
Number.isFinite("42"); // false ← 字符串不是數(shù)字
編寫健壯的函數(shù)
在實際開發(fā)中的應用:
場景1:安全的數(shù)字相加
function safeAdd(a, b) {
// 確保兩個參數(shù)都是數(shù)字類型
if (typeof a !== 'number' || typeof b !== 'number') {
throw new Error('參數(shù)必須是數(shù)字');
}
return a + b;
}
safeAdd(1, 2); // 3
safeAdd(1, "2"); // 報錯:參數(shù)必須是數(shù)字
場景2:處理多種數(shù)據(jù)類型
function processData(data) {
// getRealType方法在第3點Object.prototype.toString.call()中有寫
const type = getRealType(data);
switch(type) {
case 'array':
return data.map(item => item * 2);
case 'object':
return Object.keys(data).length;
case 'string':
return data.toUpperCase();
case 'number':
return data * 2;
default:
return '不支持的數(shù)據(jù)類型';
}
}
console.log(processData([1, 2, 3])); // [2, 4, 6]
console.log(processData("hello")); // "HELLO"
console.log(processData({a: 1, b: 2})); // 2
總結(jié):選擇合適的方法
| 場景 | 推薦方法 | 示例 |
|---|---|---|
| 判斷基本類型 | typeof | typeof "hello" === "string" |
| 判斷數(shù)組 | Array.isArray() | Array.isArray([]) |
| 判斷自定義對象 | instanceof | obj instanceof MyClass |
| 精確類型判斷 | Object.prototype.toString.call() | 見上文工具函數(shù) |
| 特殊值判斷 | 專用方法 | Number.isNaN(), Number.isFinite() |
到此這篇關(guān)于JavaScript準確判斷數(shù)據(jù)類型的5 種方法深度對比的文章就介紹到這了,更多相關(guān)JavaScript判斷數(shù)據(jù)類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
從原生到框架之前端的錯誤監(jiān)聽詳解(Vue和React兩大框架)
在前端開發(fā)中,監(jiān)聽(Event?Listener)是指在特定事件發(fā)生時執(zhí)行相應的JavaScript代碼,這篇文章主要介紹了從原生到框架之前端的錯誤監(jiān)聽(?Vue和React兩大框架)的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-09-09
JavaScript 實現(xiàn)的checkbox經(jīng)典實例分享
本文主要給大家分享的是JavaScript實現(xiàn)checkbox多項選擇的經(jīng)典代碼,非常的簡單實用,有需要的小伙伴可以參考下2016-10-10
基于JavaScript編寫一個簡易的數(shù)字轉(zhuǎn)中文功能
這篇文章主要為大家詳細介紹了如何基于JavaScript編寫一個簡易的數(shù)字轉(zhuǎn)中文功能,雖然是功能看起來很簡單,但是要是沒有寫過這類功能的話,那么可能會無從下手,下面小編就和大家詳細介紹一下吧2026-01-01
javascript 根據(jù)指定字符把字符串拆分為數(shù)組
javascript 根據(jù)指定字符把字符串拆分為數(shù)組2009-05-05

