从类型判断说起
在 JavaScript 中,进行变量的类型校验是一个非常令人头疼的事,如果只是简单的使用 typeof
会到各种各样的问题。
举几个简单的:
console.log(typeof null) // 'object'
console.log(typeof new Array) // 'object'
console.log(typeof new String) // 'object'
后来,大家发现可以使用 Object.prototype.toString()
方法来进行变量类型的判断。
const getTypeString = obj => Object.prototype.toString.call(obj)
getTypeString(null) // '[object Null]'
getTypeString('string') //'[object String]'
getTypeString(new String) //'[object String]'
对 toString()
方法进行代理,可以得到一个类型字符串,我们就可以在这个字符串上面搞事情。
const getTypeString = obj => {
return Object.prototype.toString.call(obj)
}
const isType = type => {
return obj => {
return getTypeString(obj) === `[object ${type}]`
}
}
const isArray = isType('Array') // 该方法一般通过 Array.isArray 代替
const isNull = isType('Null')
const isObject = isType('Object')
const isRegExp = isType('RegExp')
const isFunction = isType('Function')
const isAsyncFunction = isType('AsyncFunction')
isNull(null) // true
isObject({}) // true
isRegExp(/\w/) // true
isFunction(() => {}) // true
isAsyncFunction(async () => {}) // true
But,在 Node.js 中,内部其实是有一组用来判断变量类型的 api 的。而且功能异常丰富,除了基础类型的判断,还支持判断 Promis