關於 toString
方法在有關js的開發中使用應該是至關普遍的,這兩天在看jQuery的源碼,從 toString
自己瞭解與鞏固了很多知識,寫出來與你們一同分享。
首先先上一段代碼:javascript
var arr=[1,2,3]; toString.call(arr);
來看一下效果:java
衆所周知,判斷數據類型,咱們大多會使用typeof
操做符,可是typeof
操做符只能判斷基本數據類型,對於複雜的數據類型一概返回object
,而使用toString
方法在這裏能夠作一個很好的補充。spa
問:爲何要使用toString.call(arr)
,而不能直接使用arr.toString()
?
再上一段代碼:prototype
var arr=[1,2,3]; toString.call(arr); arr.toString();
來看一下效果:code
很明顯直接使用toString
,得不到咱們想要的效果,博主第一次看到這個結果時也是一臉懵逼。對象
其實,這裏面就涉及到js原型及原型鏈的相關知識
再上一段代碼:繼承
var arr=[1,2,3]; Object.prototype.toString.call(arr); Array.prototype.toString.call(arr);
來看一下效果:圖片
看到這裏你們都應該明白了,其實只有Object.prototype
上的toString
才能用來進行復雜數據類型的判斷。ip
簡單解釋一些原型鏈的概念:
咱們都知道js中的對象都繼承自Object
,因此當咱們在某個對象上調用一個方法時,會先在該對象上進行查找,若是沒找到則會進入對象的原型(也就是.prototype
)進行查找,若是沒找到,一樣的也會進入對象原型的原型進行查找,直到找到或者進入原型鏈的頂端Object.prototype
纔會中止。原型鏈
因此,當咱們使用arr.toString()
時,不能進行復雜數據類型的判斷,由於它調用的是Array.prototype.toString
,雖然Array
也繼承自Object
,但js在Array.prototype
上重寫了toString
,而咱們經過toString.call(arr)
其實是經過原型鏈調用了Object.prototype.toString
。