轉原貼
在 JavaScript 里使用 typeof 來判斷數據類型,只能區分基本類型,即 “number”,”string”,”undefined”,”boolean”,”object” 五種。
對于數組、函數、對象來說,其關系錯綜復雜,使用 typeof 都會統一返回 “object” 字符串。
要想區別對象、數組、函數單純使用 typeof 是不行的,JavaScript中,通過Object.prototype.toString方法,判斷某個對象值屬于哪種內置類型。
例子:
var arr = [];
console.log(Object.prototype.toString.call(arr))
結果:
"[object Array]"
在ES3中,Object.prototype.toString方法的規范如下:
15.2.4.2 Object.prototype.toString()
在toString方法被調用時,會執行下面的操作步驟:
獲取this對象的[[Class]]屬性的值。
計算出三個字符串"[object ", 第一步的操作結果Result(1), 以及 "]"連接后的新字符串。
返回第二步的操作結果Result(2)。
[[Class]]是一個內部屬性,所有的對象(原生對象和宿主對象)都擁有該屬性.在規范中,[[Class]]是這么定義的:
內部屬性 描述
[[Class]] 一個字符串值,表明了該對象的類型。
其過程簡單說來就是:1、獲取對象的類名(對象類型)。2、然后將[object、獲取的類名、]組合并返回。
由于 JavaScript 中一切都是對象,任何都不例外,對所有值類型應用 Object.prototype.toString.call() 方法結果如下:
console.log(Object.prototype.toString.call(123)) //[object Number]
console.log(Object.prototype.toString.call('123')) //[object String]
console.log(Object.prototype.toString.call(undefined)) //[object Undefined]
console.log(Object.prototype.toString.call(true)) //[object Boolean]
console.log(Object.prototype.toString.call({})) //[object Object]
console.log(Object.prototype.toString.call([])) //[object Array]
console.log(Object.prototype.toString.call(function(){})) //[object Function]
判斷是否為函數
function isFunction(it) {
return Object.prototype.toString.call(it) === '[object Function]';
}
判斷是否為數組:
function isArray(o) {
return Object.prototype.toString.call(o) === '[object Array]';
}