如何判斷一個值到底是什麼類型

Object.prototype.toString方法返回對象的類型字符串,因此可以用來判斷一個值的類型。

var obj = {};
obj.toString() // "[object Object]"

上面代碼調用空對象的toString方法,結果返回一個字符串object Object,其中第二個Object表示該值的構造函數。這是一個十分有用的判斷數據類型的方法。

由於實例對象可能會自定義toString方法,覆蓋掉Object.prototype.toString方法,所以爲了得到類型字符串,最好直接使用Object.prototype.toString方法。通過函數的call方法,可以在任意值上調用這個方法,幫助我們判斷這個值的類型。

Object.prototype.toString.call(value)

上面代碼表示對value這個值調用Object.prototype.toString方法。

不同數據類型的Object.prototype.toString方法返回值如下。

  • 數值:返回[object Number]
  • 字符串:返回[object String]
  • 布爾值:返回[object Boolean]
  • undefined:返回[object Undefined]
  • null:返回[object Null]
  • 數組:返回[object Array]
  • arguments 對象:返回[object Arguments]
  • 函數:返回[object Function]
  • Error 對象:返回[object Error]
  • Date 對象:返回[object Date]
  • RegExp 對象:返回[object RegExp]
  • 其他對象:返回[object Object]

這就是說,Object.prototype.toString可以看出一個值到底是什麼類型。

Object.prototype.toString.call(2) // "[object Number]"
Object.prototype.toString.call('') // "[object String]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(Math) // "[object Math]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call([]) // "[object Array]"

利用這個特性,可以寫出一個比typeof運算符更準確的類型判斷函數。

var type = function (o){
  var s = Object.prototype.toString.call(o);
  return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};
type({}); // "object"
type([]); // "array"
type(5); // "number"
type(null); // "null"
type(); // "undefined"
type(/abcd/); // "regex"
type(new Date()); // "date"

在上面這個type函數的基礎上,還可以加上專門判斷某種類型數據的方法。

var type = function (o){
  var s = Object.prototype.toString.call(o);
  return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};
['Null',
 'Undefined',
 'Object',
 'Array',
 'String',
 'Number',
 'Boolean',
 'Function',
 'RegExp'
].forEach(function (t) {
  type['is' + t] = function (o) {
    return type(o) === t.toLowerCase();
  };
});
type.isObject({}) // true
type.isNumber(NaN) // true
type.isRegExp(/abc/) // true

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章