javascript-從toString方法在判斷複雜數據類型上的妙用,引伸到對原型鏈的理解

關於 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

相關文章
相關標籤/搜索