typeof
typeof
操作符可以安全準確的判斷出Boolean
、Number
、undefined
、String
、Symbol
這5種基本型別。但是對與引用型別
和null
來說,返回的都是object
。
在現代瀏覽器中,
typeof
可以準確的判斷出一個變數是不是一個函式,如果是函式就返回字串function
instanceof
instanceof
彌補了typeof
的不足,可以用來判斷引用型別
的資料型別。但有的時候並不能保證準確性,比如在不同作用域中,修改了原始的建構函式。
const global = new Array()
function foo () {
class Array {} // 在foo函式作用域內重寫Array
console.log(global instanceof Array) // 猜列印出的是false還是true
}
foo() // 列印出的是false
複製程式碼
通過上面的例子可以看出,使用
instanceof
操作符不總是準確安全的
最安全的做法
大家都知道每個引用型別
都包含一個toString
的原型方法,有的建構函式會修改自己原型物件上的toString
方法,我們可以通過Object.prototype.toString
來呼叫最原始的toString方法。該方法會返回類似於[object Object]
的字串,Array
的例項會返回[object Array]
這樣的,其它型別類似。會發現不同型別的例項返回的字串和自己的建構函式的名字相同,於是我們就可以利用這一點來準確的判斷資料的型別。
// 還是上面的例子,這次我們改用Object.prototype.toString來判斷
const global = new Array()
const toSting = Object.prototype.toString
function foo () {
class Array {}
console.log(toString.call(global) === '[object Array]')
}
foo() // 你會驚奇的發現列印出來的是true,完美判斷出來global的型別...
複製程式碼
沒錯,就是這麼強大。