JS之变量的类型判断

148 阅读2分钟

在前端面试基础中,类型判断是经常会考的一个知识点。以下整理了typeof和instanceof的基础用法和以及其他类型判断方法。如果错误遗漏,欢迎指出😀😀😀

typeof关键字

typeof 'asd';  // -> "string"
typeof {} ;// -> "object"
typeof []; // -> "object"

typeof可以用来判断Undefined, Null, String, Number, Boolean, Function, BigInt, SymbolObject。其中特别要注意的是,typof可以判断Function,但是其他包括Array等的Object对象都只会被判断成Object。所以typeof比较适合用来判断基础类型。

所以,如果要判断常用的其他对象类型比如Array,有什么方法呢?

判断Array

  1. ES5.1中Array对象提供了isArray方法来判断,但是要注意它的兼容性。

    Array.isArray([]); // -> true
    
  2. 在MDN的文档可以看到,isArray的兼容写法如下,因此第二种方法就是利用Object.protoype.toString这个方法来判断:

    if (!Array.isArray) {
      Array.isArray = function(arg) {
        return Object.prototype.toString.call(arg) === '[object Array]';
      };
    }
    
  3. 在学习js的时候,还知道有另外一个经常用于判断类型的关键字instanceof。它的作用我觉得MDN的解释是最清楚的 👇

    instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。

    所以第三种判断数组的方法就是

    [] instanceof Array; // => true
    
  4. 按照上面一种方法的判断原理,我们会想到是否能用constructor来判断(每个object都有一个constructor属性,它指向该实例对象的构造器)

    [].constructor === Array; // => true
    

    然而对于直接用constructor来判断肯定是不够严谨的,因为一是constructor这个属性是可以被改写的,二是数组对象的原型链上有Array,但是不一定是由Array实例化的。

判断其他Object对象

从判断数组的几个方法,我们可以充分用Object.protoype.toString或者instanceof来判断其他内置对象。 关于Object.protoype.toString,可以判断String,Number,Boolean, Undefined,Null,Array,Date, Error,RegExp,Function, Math, JSON,arguments(其它的我也没试过)。