js中类型判断总结

125 阅读2分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

这篇文章下面总结了几种判断js数据类型的写法,其中涉及的js的知识点有:

  1. typeof的使用
  2. 实例、原型、构造函数的关系

在javascript中有 numberstringbooleanobjectBigIntsymbolundefinednull 8种数据类型。

其中numberstringbooleanBigIntsymbolundefinednull是基本数据类型

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 === objecttypeof 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