最安全的型別判斷

被雨水過濾的空氣不想說話發表於2018-12-09

typeof

typeof操作符可以安全準確的判斷出BooleanNumberundefinedStringSymbol這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的型別...
複製程式碼

沒錯,就是這麼強大。

完。

相關文章