几种数据类型检测的方式
typeof:用来检测数据类型的运算符,使用typeof检测数据类型,首先返回的都是一个字符串,其次字符串中包含了对应的数据类型(“number”, “string”, “boolean”, “undefined”, “function”, “object”)。
console.log(typeof 1); //Number console.log(typeof "sss"); //Number console.log(typeof true); //Number
局限性:不能具体的细分是数组还是正则,还是对象中其他的值,因为使用typeof检测数据类型,对于对象数据中的左右的值,最后返回的结果都是”object”
console.log(typeof null); // "object" console.log(typeof [2,3]); // "object" console.log(typeof /d/); // "object"
instanceof:检测一个实例是否属于某个类
var obj = [12, 23]; console.log(obj instanceof Array);// true console.log(obj instanceof RegExp);// true
局限性:
1.不能用来检测和处理字面量方式创建出来的基本数据类型值
对于基本数据来说,字面量方式创建出来的结果和实例方式创建出来的结果是有一定区别的,从严格意义上来讲,只有实例创造出来的结果才是标准对象数据类型,也是标准的Number这个类的一个实例;对于字面量创造出来的结果是基本的数据类型,不是严谨的实例,但是由于JS的松散特点console.log(1 instanceof Number); //false console.log(new Number(1) instanceof Number); //true console.log("ss" instanceof String); //false console.log(new String("ss") instanceof String); //true console.log(true instanceof RegEXP); //false
2.instance的特性:只要在当前实例的原型链上,我们用其检测出来的结果都是true
var ary = []; console.log(ary instanceof Array); //true console.log(ary instanceof Object); //true
因此在类的原型继承中,我们最后检测出来的结果未必准确
function Fn() { } var ary = new Array; Fn.prototype = ary;//原型继承:让子类的原型等于父类的一个实例 var f = new Fn;//f->Fn.prototype->Array.pr 大专栏 数据类型检测ototype->Object.prototype console.log(f instanceof Array);//true
注意:对于特出的数据类型null和undefined,它们的所属类是Null和Undefined,但是浏览器把这两个保护起来,不允许我们在外面访问使用。
undefined instanceof Undefined; //报错 null instanceof Null; //报错
constructor:作用和instaceof非常相似
var obj = [];console.log(obj.constructor === Array); //true console.log(obj.constructor === RegExp); //false
constructor可以处理基本数据类型
console.log((1).constructor === Number); //true
constructor检测Object和instanceof不一样,一般情况下检测不了
console.log((1).constructor === Number); //true console.log((1).constructor === Object); //false
局限性:我们可以把类的原型进行重写,在重写的过程中很有可能出现把之前的constructor给覆盖了,这样检测出来的结果就不准确
function Fn() { } Fn.prototype = new Array; var fn = new Fn; console.log(fn.constructor); //Array
Object.prototype.toString().call:首先获取原型上的toString方法,让方法执行,并且改变方法中this关键字的指向(所有数据类型都有toString方法)
console.log(Object.prototype.toString.call([]));//->"[object Array]" console.log(Object.prototype.toString.call(/^$/));//->"[object RegExp]" console.log(({}).toString.call(new Date));//->"[object Date]" console.log(Object.prototype.toString.call(1));//->"[object Number]" console.log(Object.prototype.toString.call("hello"));//->"[object String]" console.log(Object.prototype.toString.call(true));//->"[object Boolean]" console.log(Object.prototype.toString.call(null));//->"[object Null]" console.log(Object.prototype.toString.call(undefined));//->"[object Undefined]" console.log(Object.prototype.toString.call(function() {}));//->"[object Function]"
由上可见,采用这种方法检测数据类型是比较准确,例如:我们可以这样检测一个Array的数据类型。
var ary = []; console.log(Object.prototype.toString.call(ary) === "[object Array]");//->true