自己总结的四种检测数据类型的方法。如有不足,虚心接受大家的指点。
1.typeof检测基本数据类型的操作符
语法:result = typeof variable;
1)首先返回的都是字符串,其次字符串中为对应的数据类型。例如:“number”,“string”,“boolean”,“undefined”,“function”,“object”
局限性:不能具体细分是什么值,适合检测基本数据类型,不适合检测引用数据类型。
typeof null -> "object"
var str = 'wenjia';
var num = 25; var nul = null; var bool = true; var unde = undefined; var ary = []; var obj = {}; var reg = /^$/; function fn(){} console.log(typeof num);//字符串number
2.instanceof检测引用数据类型,某个值是什么类型的对象.某一个实例是否属于某个类
语法:result = variable instanceof constructor;
局限性:
1)不能检测和处理字面量创建出来的基本数据类型的值 字面量创建和实例创建检测值是有区别的,从严格意义上来讲,只有实例创建的菜属于对象,也属于某个类的实例,字面量创建的值为基本数据类型,不是严谨的实例,由于js松散特点,可以用对象原型上的方法。 console.log(1 instanceof Number) -> false console.log(new Number(1) instanceof Number) ->true 2)instanceof特性:只要在当前实例的原型链上,我们用其检测出来的结果都为true。 在类的原型继承中,我们最后检测出来的结果未必准确 console.log(ary instanceof Array); ->true
3.constructor 构造函数 作用和instaceof非常相似
语法:result = variable.constructor === constructor;
局限性:我们可以把类的原型进行重写,在重写的过程中很有可能出现把之前的constructor覆盖了,这样测出来的结果就不准确.console.log(ary.constructor === Array);
constructor能检测基本数据类型 console.log(num.constructor === Number);
4.Object.prototype.toString.call(); 最准确最常用方式
首先获取Object原型上的toString方法,让方法执行,并且改变方法中this关键字的指向 Object.prototype.toString作用返回当前方法执行的主体,所属类的详细信息 console.log(Object.prototype.toString.call(str)); //-> [object String] console.log(Object.prototype.toString.call(num));//-> [object Number] console.log(Object.prototype.toString.call(nul));//-> [object Null] console.log(Object.prototype.toString.call(bool));//-> [object Boolean] console.log(Object.prototype.toString.call(unde));//-> [object Undefined] console.log(Object.prototype.toString.call(obj));//-> [object Object] console.log(Object.prototype.toString.call(reg));//-> [object RegExp] console.log(Object.prototype.toString.call(fn));//-> [object Function]判断某个值是否属于某个数据类型
console.log(Object.prototype.toString.call(str) === "[object String]"); 或者用正则判断 var reg = /^\[object Array\]$/; console.log(reg.test(Object.prototype.toString.call(ary)));//true
总结:只需要检测基本数据类型,用typeof即可。检测引用数据类型细分用Object.prototype.toString.call()。