类型判断
通过学习Vue源码,获得类型的判断方式
判断对象是否有这个Key
const hasOwnProperty$1 = Object.prototype.hasOwnProperty
const hasOwn = (val, key) => hasOwnProperty$1.call(val, key)
平常都是这样判断的,相当于封装了一下更简便使用 (不过我个人觉得没有必要封装)
let obj = {
a: 'example',
b: 'test'
};
if (obj.hasOwnProperty('a')) {
console.log('The object contains key "a".')
} else {
console.log('The object does not contain key "a".')
}
判断是否是数组
const isArray = Array.isArray
没啥好说的,ES5系统提供
判断是否是Map
const isMap = (val) => Object.prototype.toString.call(val) === "[object Map]"
判断是否是Set
const isSet = (val) => Object.prototype.toString.call(val) === "[object Set]"
判断是否是Date 日期
const isDate = (val) => Object.prototype.toString.call(val) === "[object Date]"
判断是否是RegExp 正则
const isRegExp = (val) => Object.prototype.toString.call(val) === "[object RegExp]"
判断是否是Function 函数
const isFunction = (val) => typeof val === "function"
判断是否是String 字符串
const isString = (val) => typeof val === "string"
判断是否是Symbol
const isSymbol = (val) => typeof val === "symbol"
判断是否是Object 广泛
const isObject = (val) => val !== null && typeof val === "object"
这个判断是广泛的object,array
、RegExp
、Date
、Error
、Map
、WeakMap
、Set
、Promise
、window
和{}
都会判断为true。这里null因为历史原因也被认为是object所以需要去除
typeof null 返回 “object” 是 JavaScript 的一个老早的bug。在 JavaScript 的最初版本中,使用的是 32位系统,为了性能考虑使用低位存储了变量的类型信息,000 开头代表是对象,而 null 表示为全零,所以,typeof null 会返回 “object”。
虽然这是一个明显的错误,而且被认识到后,已经修复了很多其他语言的类似错误,但是在 JavaScript 中却被保留下来,主要是因为修复它有可能会破坏现有的代码(这也是常见公司屎山项目的原因,不敢动原有代码只能往上添加修复)。所以至今仍然有 typeof null === ‘object’。
判断是否是Object 精确
const isPlainObject = (val) => Object.prototype.toString.call(val) === "[object Object]"
只会判断普通的 JavaScript 对象(即通过字面量 {}
或 new Object()
创建的对象)是对象
判断是否是Promise
const isPromise = (val) => {
return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch)
}
获取类型 (Object.prototype.toString.call)
const toRawType = (val) => Object.prototype.toString.call(val).slice(8, -1)
通过 Object.prototype.toString 截取其中的具体类型
目前js中有23种
String、Number、Boolean、Null、Undefined、Symbol、BigInt、Number、Function、GeneratorFunction、AsyncFunction、Object、Array、Function、RegExp、Date、Error、Map、WeakMap、Set、Promise、Math、Window/global
总结
instanceof
检查一个对象是否是某个构造函数的实例,或者是否在该构造函数的原型链上
typeof
只能判断基础类型 string、number、boolean、undefined、symbol、bigint、number (null无法判断)
如果要精细判断最好采用Object.prototype.toString.call 封装成的 toRawType
方法判断
| 值 | toRawType
转换后的值 |
| :——————————— | ——————— |
| ‘1’ | String |
| 1 | Number |
| false | Boolean |
| null | Null |
| undefined | Undefined |
| Symbol(1) | Symbol |
| BigInt(123) | BigInt |
| Infinity | Number |
| -Infinity | Number |
| NaN | Number |
| Object | Function |
| () => {} | Function |
| function*() { } | GeneratorFunction |
| async function() { } | AsyncFunction |
| {} | Object |
| [1, 2] | Array |
| new RegExp(“\d”) | RegExp |
| new Date() | Date |
| new Error(“error”) | Error |
| new Map() | Map |
| new WeakMap() | WeakMap |
| new Set() | Set |
| new Promise(resolve => resolve(1)) | Promise |
| Math | Math |
| window/global | Window/global |