JavaScript 類型判斷 Best Practice

JavaScript 類型

JavaScript 的資料型別可分為 6Primitive Type 跟一個 Object

  • Primitive Type
    • null
    • undefined
    • Boolean
    • Number
    • BigInt
    • String
    • Symbol
  • Object

Function、Array 等等原型鏈底層其實都是 Object

Primitive Type 除了nullundefined

其他的調用方法時,外層都還會再包裝一層Object wrapper

調用過後,包裝的實例會自動銷毀

object wrapper

const str = 'hello'
console.log(str.length) // 5

str.a = '123'
console.log(str.a) // undefined

typeof

typeof primitive value

MDN有個 primitive value 用 typeof 回傳的值的表

typeof

除了null之外,其他的 primitive value 都如預期

nullObject這個 bug,有它歷史的原因

詳情可以參考 Dr. Axel RauschmayerThe history of “typeof null”這篇文章

他 blog 也有一篇有趣的文章叫JavaScript history: undefined

他有寫了幾本的 Javascript 書籍,可以線上免費閱讀

typeof object

其他非 primitive 用 typeof 回傳的值,不是function就是object

沒辦法知道更細粒度的判斷ArrayErrorDate之類的

lodash 跟 vue.js 的判斷方式

lodashvue.js都是利用 Object prototypetoString 方法來判斷

寫法大致如下

const toTypeString = (value) => Object.prototype.toString.call(value)
// value強制使用 Object 的 toString 方法

const isRegExp = (val) => toTypeString(val) === '[object RegExp]'
const isDate = (val) => toTypeString(val) === '[object Date]'
const isError = (val) => toTypeString(val) === '[object Error]'
const isSet = (val) => toTypeString(val) === '[object Set]'
const isMap = (val) => toTypeString(val) === '[object Map]'
const isWeakMap = (val) => toTypeString(val) === '[object WeakMap]'
const isWeakSet = (val) => toTypeString(val) === '[object WeakSet]'

vue.js 他有些類型判斷的還是用 typeof

雖然 Object toString 的方式可以通吃