她辛苦多年忍受折磨好不容易赢得的孤独特权,绝不肯用来换取一个被虚假迷人的怜悯打扰的晚年 ---《百年孤独》
相较于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所属类的信息