在 JavaScript 裏使用 typeof 來判斷數據類型,只能區分基本類型,即 「number」,」string」,」undefined」,」boolean」,」object」,「function」,「symbol」 (ES6新增)七種。數組
對於數組、null、對象來講,其關係錯綜複雜,使用 typeof 都會統一返回 「object」 字符串。函數
要想區別對象、數組、函數單純使用 typeof 是不行的,JavaScript中,經過Object.prototype.toString方法,判斷某個對象值屬於哪一種內置類型。spa
在介紹Object.prototype.toString方法以前,咱們先把toString()方法和Object.prototype.toString.call()方法進行對比。prototype
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方法。code
應用場景:若是沒有應用場景講這個也沒啥用了,那到底有啥用呢?對象
Object.prototype對象上的toString方法能夠用來判斷數據類型blog
Object.prototype.toString.call(arr); //"[object Array]" 判斷是不是數組
而重寫後的toString方法能夠把對象轉換成字符串,還能夠把數值轉換成不一樣進制的數繼承
[1,2].toString();// "1,2" 獲得字符串
(10).toString(2);//10進制轉2進制 1010 ,若是1.toString(2)會報錯,由於js會認爲.是數字的小數點而不是調用符號
其實,這裏面就涉及到js原型及原型鏈的相關知識ip
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]]