“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
这篇文章下面总结了几种判断js数据类型的写法,其中涉及的js的知识点有:
typeof的使用- 实例、原型、构造函数的关系
在javascript中有 number、string、boolean、object、BigInt、symbol、undefined、null 8种数据类型。
其中number、string、boolean、BigInt、symbol、undefined、null是基本数据类型
object是引用数据类型
第一种方法
function whatType1(tar) {
const t = typeof tar
if(t === 'object' && !tar) return 'null'
if(t === 'object' && tar instanceof Array) return 'array'
return tar
}
【注意】
typeof null === object、typeof array === object,使用typeof判断js数据类型需要注意注意这两种情况,使用其他方法加以区分。
第二种方法
function whatType2(tar) {
const ans = Object.prototype.toString.call(tar)
return ans.slice(8, ans.length-1).toLowerCase()
}
Object原型上有一个toString方法,可以使用其来判断js数据类型,例如 Object.prototype.toString.call([1,2,3]) === '[object Array]'是一种比较全面的方法,适用于所有js数据类型的判断。
第三种方法
function whatType3(tar) {
const t = typeof tar
if(t === 'object' && !tar) return 'null'
if(t === 'object' && tar.constructor === Array) return 'array'
return tar
}
利用了对象属性按原型链查找,且实例原型上存在一个constructor属性指向实例的构造函数,利用其关系来判断数据类型。
第四种方法
function whatType4(tar) {
const t = typeof tar
if(t === 'object' && !tar) return 'null'
if(t === 'object' && tar.__proto__ === Array.prototype) return 'array'
return tar
}
利用了实例对象存在__proto__属性指向原型,实力构造函数存在prototype属性指向原型,利用其其关系,判断二者是否相等,来判断数据类型。
其实instanceof可利用上述原理实现
function myInstanceof1 (tar,
constructorFunc) {
const pro = tar.__proto__
if(pro === null) return false
if(pro === constructorFunc.prototype){
return true
}
return myInstanceof1(pro, constructorFunc)
}
function myInstanceof2 (tar,
constructorFunc) {
let pro = tar.__proto__
while(pro) {
if(pro === constructorFunc.prototype){
return true
}
pro = pro.__proto__
}
return false
}
// 测试用例
myInstanceof1({a: 1}, Array) --- false
myInstanceof1([1, 2], Array) --- true