js中經過Object.prototype.toString方法----精確判斷對象的類型

在 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

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方法。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會認爲.是數字的小數點而不是調用符號

爲何toString會有不一樣的做用呢?

其實,這裏面就涉及到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]]
相關文章
相關標籤/搜索