JS学习——数据类型校验

148 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

前言

日常开发中,我们需要对某个变量进行类型检验,比如当我们书写深拷贝的递归函数时候,就需要判断数据类型,再比如vue源码中也有很多地方都用到了类型检验。每个检验方法返回结果都有所不同,今天我们就来总结一下相关的方法。

typeof

typeof是常用的一种检验方法,基础用法typeof+数据,它的返回值是该数据的数据类型,它是一个操作符,对于基本数据类型,除了null,typeof能够精确的检验出来,但是对于引用数据类型就不能精确检验。

console.log(typeof false); //boolean
console.log(typeof undefined); //undefined
console.log(typeof null); //object
console.log(typeof new Array()); //object

为什么“null”typeof不能检验出来为null呢?明明null就是js基本数据类型的一种。这是因为typeof把它当成了一个空对象处理啦。

instanceof

instanceof也可以用来检验数据类型,与typeof返回数据类型不同,instanceof返回的是布尔值,用法也比typeof复杂点。数据+instanceof+数据类型,根据这个表达式我们可以将instaceof理解为数据是否符合该类型。

   const str = new String('0')
   console.log(0 instanceof Number)//false
   console.log('0' instanceof String)//false
   console.log(str instanceof String)//true
   console.log(str instanceof Object)//true

这个结果好像出乎我们的意料,这是因为isntanceof是通过原型链去判断的。前两个常量是没有原型链让instanceof去判断的,所以为false。当我们去new String()写一个变量的时候,该原型链是包含Object的,所以后两个都是true了。

Array.isArray()

如果我们想要判断是否为数组,那么isArray()方法是我们的好帮手,它的返回值也是布尔值,如果是数组的话就返回true。

  const arr = [1,2]
  const str = '123'
  console.log(Array.isArray(arr))//true
  console.log(Array.isArray(str))//false

toString()

toString()我们平时可以用该方法来转换字符串,同时它还有一个用法就是检验数据类型,而且这个方法是Object上的原型方法,该方法会返回一个结果[Object 具体的数据类型],因为是Object原型方法,所以当检验数组、函数等需要用call来调用

     console.log(Object.prototype.toString.call([1,2,3])); //[object Array]
     console.log(Object.prototype.toString.call(new Number(2)))//[object Number]
     console.log(Object.prototype.toString.call(null))//[object Null] null也能判断出来

constructor

constructor是构造函数原型上的一个属性,我们知道该属性是指向构造函数本身的,利用这一点我们就可以通过constructor,来校验数据类型,它也是返回一个布尔值。

    console.log(new Number(1).constructor ===  Number);//true
    console.log([1,2,3].constructor === Array); //true

总结

好了,以上就是数据校验的几种方法,对于上面几种方法我们可以总结一下:

  • typeof用法简单,但是对于引用数据类型不能精确校验。
  • instanceof对于高ypeof可以进一步检验引用数据类型,数组、函数等。但是原型链上的类型都会返回true。
  • Arrary.isArray()只适用于数组判断,toString()检验精确,但用法复杂。
  • constructor检验比较精确,但用法也比较复杂,而且constructor可以被修改。