前端小技巧: TS实现一个获取传入参数类型的函数
核心API: Object.prototype.toString.call
·
分析
- 在前端中,能判断类型的无非几种
- 1 )typeof 只能判断值类型,其他就是 function 和 object
- 2 ) instanceof 需要两个参数判断,不是获取
- 3 )手动枚举各种类型
- 可能会忽略某些类型
- 如果新增了类型,则需要修改代码
- 这种方案不可取
- 4 )原生API
Object.prototype.toString.call(input)input 是用户输入- 而非
input.toString()这种不可行
测试 Object.prototype.toString.call
Object.prototype.toString.call(12)// ‘[object Number]’Object.prototype.toString.call(NaN)// ‘[object Number]’Object.prototype.toString.call(-Infinity)// ‘[object Number]’Object.prototype.toString.call('abc')// ‘[object String]’Object.prototype.toString.call([])// ‘[object Array]’Object.prototype.toString.call({})// ‘[object Object]’Object.prototype.toString.call(() => {})// ‘[object Function]’Object.prototype.toString.call(new Set())// ‘[object Set]’Object.prototype.toString.call(new WeakSet())// ‘[object WeakSet]’Object.prototype.toString.call(new Map())// ‘[object Map]’Object.prototype.toString.call(new WeakMap())// ‘[object WeekMap]’Object.prototype.toString.call()// ‘[object Undefined]’Object.prototype.toString.call(undefined)// ‘[object Undefined]’Object.prototype.toString.call(null)// ‘[object Null]’
基于以上测试,可看到可以获取具体的类型
代码实现
1 )编码
export function getType(input: any): string {
const orgType = Object.prototype.toString.call(input) // '[object String]'
const i = orgType.indexOf(' ')
const type = orgType.slice(i + 1, -1)
return type.toLowerCase() // 'string'
}
2 )测试
console.log(getType(1)) // number
console.log(getType(NaN)) // number
console.log(getType('ass')) // string
console.log(getType(null)) // null
console.log(getType(undefined)) // undefined
console.log(getType({})) // object
console.log(getType(() => {})) // function
console.log(getType(new WeakSet())) // weakset
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)