我们先准备一组不同变量的列表用于测试
const allVarsMap = {
// 数字
num: 123,
// Infinity
numInfinity: 1 / 0,
// NaN
numNaN: null / 0,
// 字符串
str: 'abcdef',
// 布尔类型
bool: true,
// 数组
arr: [1, 2, 3, 4],
// json对象
jsonObj: { name: 'wenzi', age: 25 },
// 函数
func: function () {
console.log('this is function')
},
// 箭头函数
arrowfunc: () => {
console.log('arrow function')
},
// undefined类型
und: undefined,
// null类型
nul: null,
// date类型
date: new Date(),
// 正则表达式
reg: /^[a-zA-Z]{5,20}$/,
// 异常类型
error: new Error(),
//symobl类型
symbolType: Symbol('hello'),
}
01.使用typeof判断变量类型
typeof
可以判断变量类型,但是这个方法只能区分基本类型(string,number),对于引用类型,比如数组和对象,他返回的都是object.无法进行精确的判断
我们执行下面的函数可以得到typeof判断的结果
function useTypeof(allVarsMap) {
console.log('typeof result:')
for (let key in allVarsMap) {
console.log(`typeof ${key} is ${typeof allVarsMap[key]}`)
}
}
我们看到,他把infinity和NaN都识别为number,Null,array和obj都识别成obj,也无法区分普通函数和箭头函数。
typeof result:
typeof num is number
typeof numInfinity is number
typeof numNaN is number
typeof str is string
typeof bool is boolean
typeof arr is object
typeof jsonObj is object
typeof func is function
typeof arrowfunc is function
typeof und is undefined
typeof nul is object
typeof date is object
typeof reg is object
typeof error is object
typeof symbolType is symbol
02.instanceof检查变量类型
instanceof 是用于判断对象的类型的,和typeof不同的地方是,你需要明确指出类型。
它实际上是判断你当前实例的构造函数的原型链上是否有你指定的对象。
下面是使用例子
console.log(allVarsMap.date ``instanceof` `Date) // true
console.log(allVarsMap.func ``instanceof` `Function) // true
03.使用Object.prototype.toString.call
可以返回对象内部的字符串。
执行下面的函数查看执行结果
function useProtoStr(allVarsMap) {
console.log('proto string result:')
for (let key in allVarsMap) {
console.log(
`protoStr of ${key} is ${Object.prototype.toString.call(
allVarsMap[key]
)} `
)
}
}
useProtoStr(allVarsMap)
下面是执行结果,可以看到,各种类型都能比较好地进行区分了。
proto string result:
protoStr of num is [object Number]
protoStr of numInfinity is [object Number]
protoStr of numNaN is [object Number]
protoStr of str is [object String]
protoStr of bool is [object Boolean]
protoStr of arr is [object Array]
protoStr of jsonObj is [object Object]
protoStr of func is [object Function]
protoStr of arrowfunc is [object Function]
protoStr of und is [object Undefined]
protoStr of nul is [object Null]
protoStr of date is [object Date]
protoStr of reg is [object RegExp]
protoStr of error is [object Error]
protoStr of symbolType is [object Symbol]
综上,如果我们要判断一个变量地类型,可以先用typeof 判断是不是基本类型的一种,如果是object类型,再使用Object.prototype.toString.call来获取准确的类型。
网友评论