一、字串、數字、布林值、undefined的最佳選擇市使用 typeof 運算子進行檢測:
- 對於字串,typeof 返回"string"
- 對於數字,typeof 返回"number"
- 對於布林值,typeof 返回"boolean"
- 對於undefined,typeof 返回"undefined"
用法:typoef variable 或 typeof(variable)
二、null 判斷
由於 typeof null 返回的值為 "object"(這是一個被詬病的語言本身設計存在的BUG),我們不能使用 typeof 來對 一個變數值是否為 null 進行判斷。此外我們一般不建議將變數與 null 進行比較。
不好的寫法:
if( item !== null ) {
// 執行一些邏輯......
}
除非在你能預見該變數有可能等於 null 的情況下,你才可以使用恆等運算子(===)和非恆等運算子(!==)進行比較:
var ele = document,getElementById("box");
if( ele === null ) { // 執行一些邏輯...... }
三、陣列、物件與函式的檢測
1. 陣列,由於陣列屬於引用型別,並且使用 typeof 對其進行檢測返回的值為"object",在無法使用 typeof 判斷的情況下,最佳的解決方案如下:
function isArray( value ) { if( typeof Array.isArray === "function" ) { return Array.isArray(value); } else { return Object.prototype.toString.call(value) === "[object Array]"; } }
2. 函式,雖然函式也屬於引用型別,但因為 typeof 對函式檢測的返回值為"function",因此檢測函式的最好方案是使用 typeof :
function func() {}
typeof func === "function" // true
陷阱:在 IE8 及 IE8 以下中使用 typeof 對DOM 節點中的方法檢測會返回"object",因此在該場景下的替換方案為:
// IE8及IE8以下 console.log( typeof document.getElementById ); // "object" // 替換方案 if( "getElementById" in document ) { //執行邏輯...... }
3. 自定義物件和內建物件,由於 typeof 對所有引用型別資料都返回"object"(函式除外),因此我們一般使用 instanceof 來判斷其屬於哪種引用型別:
(跨frame使用會出現問題,因為每個文件都有各自的內建物件Object、Date、Function等)
var obj = {} console.log( obj instanceof Object ); // true function Person (name) { this.name = name } var person = new Person("Jack"); console.log( person instanceof Person ); // true var time = new Date(); console.log( time instanceof Date ); // true