在前端面试基础中,类型判断是经常会考的一个知识点。以下整理了typeof和instanceof的基础用法和以及其他类型判断方法。如果错误遗漏,欢迎指出😀😀😀
typeof关键字
typeof 'asd'; // -> "string"
typeof {} ;// -> "object"
typeof []; // -> "object"
typeof可以用来判断Undefined, Null, String, Number, Boolean, Function, BigInt, Symbol和 Object。其中特别要注意的是,typof可以判断Function,但是其他包括Array等的Object对象都只会被判断成Object。所以typeof比较适合用来判断基础类型。
所以,如果要判断常用的其他对象类型比如Array,有什么方法呢?
判断Array
-
ES5.1中Array对象提供了
isArray方法来判断,但是要注意它的兼容性。Array.isArray([]); // -> true -
在MDN的文档可以看到,isArray的兼容写法如下,因此第二种方法就是利用
Object.protoype.toString这个方法来判断:if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; }; } -
在学习js的时候,还知道有另外一个经常用于判断类型的关键字
instanceof。它的作用我觉得MDN的解释是最清楚的 👇instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
所以第三种判断数组的方法就是
[] instanceof Array; // => true -
按照上面一种方法的判断原理,我们会想到是否能用
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(其它的我也没试过)。