1. 程式人生 > >使用Object原型中的toString判斷資料型別

使用Object原型中的toString判斷資料型別

使用Object原型中的toString方法判斷資料型別

在JavaScript中並沒有官方的給出判斷變數資料型別的方法。而在以前我也是一直使用的typeof結合instanceof的方法來判斷的。直到最近的一次面試,才學到了通過Object原型中的toString方法來判斷資料型別的方法。

先來簡單看一下用法:

toString00

可以看到,使用這個方法可以輕易的得到使用變數的資料型別。並且像Array這種複雜資料型別也能準確的判斷出來。

那麼這個方法和instanceof判斷有什麼不同呢?

instanceof,顧名思義是判斷某個變數是否是某個類或者說函式的例項。所以我猜測在判斷時,會順著原型鏈向上查詢該例項的原型,如果匹配到了那麼返回true否則返回false。

而toString方法則是直接返回物件的型別,因此也就少了很多問題。不過這個方法對於那些不屬於js內建型別的變數,檢測為object型別。

在剛剛接觸到這個方法的時候也是心存疑惑,為什麼需要去object上取這個方法,而不是直接使用那個物件的toString方法呢?

因為JavaScript中的很多內建物件都重寫了toString函式,跟最初的object上的函式功能已然不一樣。

型別 行為描述
Array 將 Array 的每個元素轉換為字串,並將它們依次連線起來,兩個元素之間用英文逗號作為分隔符進行拼接。
Boolean 如果布林值是true,則返回”true”。否則返回”false”。
Date 返回日期的文字表示。
Error 返回一個包含相關錯誤資訊的字串。
Function 返回如下格式的字串,其中 functionname 是一個函式的名稱,此函式的 toString 方法被呼叫: “function functionname() { [native code] }”
Number 返回數值的字串表示。還可返回以指定進製表示的字串,請參考Number.toString()
String 返回 String 物件的值。
Object 返回”[object ObjectName]”,其中 ObjectName 是物件型別的名稱。

通常情況下,我們使用console.log輸出到控制檯的變數,都是經過tostring轉化之後的。

因此我們如果想要獲取變數的資料型別,就只能通過object上的tostring方法了。

在平時,我們使用該方法判斷Array型別的變數比較多,因為其他型別的變數相對來說比較容易得到型別。所以將其封裝成一個方法:

function isArray(arr) {
    var arrType = Object.prototype.toString.call(arr);
    return arrType === "[object Array]";
}