javascript資料型別檢測方法

白牙青森發表於2014-04-21

一、字串、數字、布林值、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

 

相關文章