在 JavaScript 里使用 typeof 來判斷數據類型,只能區分基本類型,即 “number”,”string”,”undefined”,”boolean”,”object”,“function”,“symbol” (ES6新增)七種。
對於數組、null、對象來說,其關系錯綜復雜,使用 typeof 都會統一返回 “object” 字符串。
要想區別對象、數組、函數單純使用 typeof 是不行的,JavaScript中,通過Object.prototype.toString方法,判斷某個對象值屬於哪種內置類型。
在介紹Object.prototype.toString方法之前,我們先把toString()方法和Object.prototype.toString.call()方法進行對比。
toString()方法和Object.prototype.toString.call()方法對比
var arr=[1,2]; //直接對一個數組調用toString()
arr.toString();// "1,2"
//通過call指定arr數組為Object.prototype對象中的toString方法的上下文
Object.prototype.toString.call(arr); //"[object Array]"
Object.prototype中的toString方法是確實被繼承下來了,但是很多東西總不會一層不變,作為兒子的數組重寫了toString方法,所以直接調用數組對象上面的toString方法調用到的實際是重寫后的方法,並不是Object.prototype中的toString方法。
應用場景:如果沒有應用場景講這個也沒啥用了,那到底有啥用呢?
Object.prototype對象上的toString方法可以用來判斷數據類型
Object.prototype.toString.call(arr); //"[object Array]" 判斷是否是數組
而重寫后的toString方法可以把對象轉換成字符串,還可以把數值轉換成不同進制的數
[1,2].toString();// "1,2" 得到字符串
(10).toString(2);//10進制轉2進制 1010 ,如果1.toString(2)會報錯,因為js會認為.是數字的小數點而不是調用符號
為什么toString會有不同的作用呢?
其實,這里面就涉及到js原型及原型鏈的相關知識
var arr=[1,2,3]; Object.prototype.toString.call(arr); Array.prototype.toString.call(arr);
來看一下效果:

看到這里大家都應該明白了,其實只有Object.prototype上的toString才能用來進行復雜數據類型的判斷。
簡單解釋一些原型鏈的概念:
我們都知道js中的對象都繼承自Object,所以當我們在某個對象上調用一個方法時,會先在該對象上進行查找,如果沒找到則會進入對象的原型(也就是.prototype)進行查找,如果沒找到,同樣的也會進入對象原型的原型進行查找,直到找到或者進入原型鏈的頂端Object.prototype才會停止。
所以,當我們使用arr.toString()時,不能進行復雜數據類型的判斷,因為它調用的是Array.prototype.toString,雖然Array也繼承自Object,但js在Array.prototype上重寫了toString,而我們通過toString.call(arr)實際上是通過原型鏈調用了Object.prototype.toString。
精確判斷對象的類型
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] console.log(Object.prototype.toString.call(null)); //[[object Null]]
