js中常用的数据类型检测方法

416 阅读2分钟

她辛苦多年忍受折磨好不容易赢得的孤独特权,绝不肯用来换取一个被虚假迷人的怜悯打扰的晚年 ---《百年孤独》

相较于java中严格的定义数据类型来说,js语言较为松散。很多时候,我们都要对数据类型进行判断。

typeof

  • 用来检测数据类型的运算符
  • 用法:typeof value
  • 返回结果:返回一个字符串,字符串中包含了我们需要检测的数据的数据类型
typeof 12;   //'number'
typeof NaN;   //'number'
typeof undefined;  //'undefined'

typeof null;   //'object' ,虽然是基本类型值,但是它属于空对象指针,检测结果是对象(局限性)
typeof function(){};   //'function'
typeof (1>1?0:2);   //'number'
typeof 1>1?0:2;   //2
typeof typeof []   // 'string'

instanceof && constructor

  • instanceof:检测某一个实例是否隶属于某个类
  • constructor:构造函数

instanceof

使用instanceof检测某个值是否属于一个数据类型的内置类,从而检测出它是否是这个数据类型:使用instanceof可以实现typeof实现不了的,对对象数据类型值的详细区分检测:

[] instanceof Array;  //true
[] instanceof RegExp;   //false

使用instanceof的弊端是,基本数据类型的值无法基于instanceof进行检测

看下下面的事例

let num = 12;
num.toFixed(2); //12.00,这是Number类的一个实例,可以调取Number.prototype上的方法,但是它是基本数据类型值

let num2 = new Number(12);
num2.toFixed(2);  //12.00

typeof num; //'number'
typeof num2;   //'object'

//不管哪种方法创建的基本数据类型的值,都是自己所属类的实例,只不过类型不一样而已

num instanceof Number;//false
num2 instanceof Number; //true

instanceof检测数据类型是顺着原型链进行检测的,只要当前类在实例的原型上,最后返回的结果都是true

constructor

获取当前要检测的数据值的constructor,判断它是否是某一个数据类型的内置类。但是,用contructor检测数据类型非常不可靠,因为这个属性时经常容易被修改的。

let arr = [];
arr.constructor === Array; //true
arr.constructor === Object; //false

arr.constructor = 'AA';
arr.constructor === Array; // false

Object.prototype.toString.call([value])

  • 获取Object.prototype上的toString方法,让方法中的this指向需要检测的数据类型值,并让该方法执行。
  • 在Number、String、Boolean、Array、Function、RegExp...这些类的原型上都有toString方法,这个方法就是将本身的值转化为字符串
  • 在Object这个类的原型上也有一个toString方法,但是这个方法不是把值转化为字符串,而是返回当前值的所属类的详细信息,固定格式为:'[object 所属类名称]'
var obj = {name:'Selly'};
obj.toString(); //'[object Object]'

Object.prototype.toString.call(12);//'[object Number]'
Object.prototype.toString.call(true);//'[object Boolean]'

Object.prototype.toString()方法执行时,会返回当前方法中this所属类的信息