判斷數據類型的偏方不少,可是不少就不是那麼的特別準確,好比 typeof 無法判斷是 Object 仍是Array。數組
通用方法就是查找該數據類型的原型。app
首先咱們宏觀的知道下,在 JavaScript 中全部的類型若是沒有指明繼承某個類型,則默認是繼承的 Object 類型。這種 默認繼承也是經過原型鏈的方式完成的。學習
能夠理解 Array 繼承了 Object,Number 繼承了 Object 等。prototype
來微觀的理解下,這些關係。翻譯
Object 的原型:對象
object 的原型中有這些 屬性或方法,一看咱們就很直觀的能夠認爲 這個 Object.prototype 是一個對象,正應了咱們以前學習的 原型也是一個對象blog
來看看 Array 的原型繼承
圖片有點長,就是截圖全點,看到下面的 __proto__ 這個屬性。 對比這裏 __proto__ 再看看Object 的 prototype ,看看,是否是一毛同樣啊! 眼鏡有欺騙的嫌疑,咱們用計算機代碼說出事實。圖片
對比這個直接翻譯一下: 數組的原型的屬性__proto__ 等於 對象的原型。好像沒明白這個意思。。。,這就是咱們以前理解的 數組的原型對象繼承了的 Object 的原型對象,怎麼繼承的?或者他們怎麼關聯的,就是經過這個 內部屬性__proto__。ip
以上暫時理解這麼多,下面接入正題,咱們該如何正確的知道數據的類型是什麼呢?
——————————————————————————————————————————————
來再看看 Object 的 prototype,
裏面有個 toString 的方法,咱們來調用下,返回了一個 "[object Object]" 的字符串
既然Array.prototype 也有toString 方法,那咱們來調用一下。 返回的是一個空字符串。。。。 這是爲啥呢,和Object 都有toString ( ),爲啥我數組返回的就是一個空字符串。object 就能返回 一個 Object 的 字符串呢?糾結中,我哪不如人家對象了。。。。。
無論爲何了,既然數組和對象有繼承關係,那我數組不就是能夠「借用」 我 「爹」的 能力了,這樣想的話, call 和apply 就蹦出來了。
再來看看 number
集合一下:
這個方法就能夠知道,咱們可以很準確的判斷咱們的數據類型了。
結束:以上是個人我的見解,若是有不妥的地方,敬請批評指出,共同進步。