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


在 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]]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM