当前位置: 首页 > 科技观察

Javascript类型检测的四种方法

时间:2023-03-18 11:45:18 科技观察

1.typeof主要用于判断基本数据类型。用法:typeof(expression)和typeof变量名,第一种是对表达式进行操作,第二种是对变量进行操作。typeof运算符的返回类型是字符串,值包括以下几种:'undefined':未定义的变量或值'boolean':布尔变量或值'string':字符串变量或值'number':一个变量orvalueofnumerictype'object':对象类型的变量或值,或者null(这是js历史遗留下来的问题,null被当做对象类型)'function':函数类型的变量或值示例如下:控制台。日志(一个类型);//'未定义'console.log(typeof(true));//'布尔值'console.log(typeof'123');//'字符串'console.log(typeof123);//'number'console.log(typeofNaN);//'数字'console.log(typeofnull);//'对象'varobj=newString();console.log(typeof(obj));//'对象'varfn=function(){};控制台日志(类型(fn));//'函数'console.log(typeof(classc{}));//'function'typeof的缺点:无法区分对象、数组和正则表达式,对它们的所有操作都返回“object”;(正则性比较特殊,后面会讲到)Safar5和Chrome7之前的版本对正则对象返回'function'。在IE6、7、8中,大部分hosts对象是对象,不是函数;例如:警报类型;//objectandinnon-IDbrowsersorIE9andabove(includingIE9),typeofalert;//函数返回空对象。总结:typeof运算符用来判断对象的类型,但是对于一些创建的对象,都是返回'object',有时候我们需要判断这个实例是否是一个对象的实例,这时候就需要用到instanceof运算符此时。其次,instanceof用于判断引用数据类型。所有引用数据类型的值都是Object的实例。目的是判断一个对象的原型链上是否有构造函数的原型属性。用法:变量instanceof构造函数示例如下://examplevararr=[];因为:1.arr.constructor===Array2。arr.__proto__===Array.prototype3。arr.__poto__.proto__===Object.prototype所以,下面都返回true1。arrinstanceofarr.constructor(Array)2。arrinstanceofarr.__proto__.constructor(Array)3。arrinstanceofarr.__proto__.__poto__.constructor(Object)如果你了解了原型链,你很快就会得出一些结论:1.所有的对象instanceof对象都会返回true2.所有的函数instanceof函数都会返回true总结:instanceof可以不仅要检测构造对象的构造函数,还要检测原型链。instanceof需要在前面有一个对象,在后面有一个构造函数。返回值是布尔值,要么是真要么是假。3、Array.isArray()Array.isArray()可以用来判断数组类型。支持的浏览器包括IE9+、FireFox4+、Safari5+、Chrome;兼容实现:if(!Array.isArray){Array.isArray=function(arg){returnObject.prototype.toString.call(arg)==='[objectArray]';};}例子如下://1.Array.isArray([1,2,3,4]);//-->true//2.varobj={a:1,b:2};Array.isArray(obj);//-->false//3.Array.isArray(newArray);//-->true//4.Array.isArray("Array");//-->false总结:isArray是使用Array对象(类)调用的静态方法,而不是数组对象实例。其中Array.prototype也是一个数组,Array.isArray比instanceof更好。4.Object.prototype.toString.call()要确定一个对象值属于哪个内置类型,最可靠的方法是使用Object.prototype.toString方法。object.prototype.toString()的输出格式是[对象对象数据类型]。示例如下:console.log(Object.prototype.toString.call("jerry"));//[objectString]console.log(Object.prototype.toString.call(12));//[objectNumber]console.log(Object.prototype.toString.call(true));//[对象布尔值]console.log(Object.prototype.toString.call(undefined));//[对象未定义]console.log(Object.prototype.toString.call(null));//[objectNull]console.log(Object.prototype.toString.call({name:"jerry"}));//[objectObject]console.log(Object.prototype.toString.call(function(){}));//[对象函数]console.log(Object.prototype.toString.call([]));//[对象数组]console.log(Object.prototype.toString.call(newDate));//[objectDate]console.log(Object.prototype.toString.call(/\d/));//[objectRegExp]functionPerson(){};console.log(Object.prototype.toString.call(newPerson));//[对象对象]