您的位置:首页 > Web前端 > JavaScript

改善javaScript118个建议-检测内置的数据类型

2015-12-07 14:02 721 查看
使用typeof运算符返回一个用于识别其运算数据类型的字符串。对于任何变量来说,使用typeof运算符总是以字符串的形式返回以下6种类型之一:

“number”

“string”

“boolean”

“object”

“function”

“undefined”

不幸的是,使用typeof检测null,返回的是“object”,而不是”null”。更好的检测null的方法其实很简单:



function type(o){
return (o===null)?"null":typeof(o);
}


这样就可以避免开因为null值影响基本数据的类型检验了。注意:typeof不能检测复杂的数据类型,以及各种特殊用途的对象。如正则表达对象,日期对象,数学对象。

对于对象或数组,可以使用constructor属性。该属性引用的是原来构造该对象的函数。如果结合typeof和constructor属性,基本能够完成类型的检

测。

数据类型检测表

值(value) | typeof value| value.contructor

——– | — | —

var value=1| “number” | Number

var value=”a” | “string” | String

var value=true | “boolean” | Boolean

var value ={} |”object” |Obejct

var vlue = new Object ()|”object”|Object

var value = []|”object”|Array

var value = function(){}|”function”|Function

function person(){}|”obecjt”|person

使用constructor可以检测绝大多数的类型,但是对于undefined和null特殊值就不能使用constructor,因为javaScript解析器会抛出异常。此时可以先把值转换布尔型,如果为true,则说明不是undefined或者null值,然后再调用constructor属性。



var value = undefined;

alert(typeof value) ; //”undefined”

alert(value && value.contructor); //undefined

var value = null;

alert(typeof value);//”object”

alert(value && typeof value);//null

使用toString()检测类型

使用toString检测类型最为安全、最为准确。调用toString()方法把对象转换为字符串,然后通过检测字符串中是否包含数组特有的标志字符可以确定对象的类型。toString返回的字符串形式如下:

[object class]

其中object表示通用类型,class表示对象的内部类型。内部类型的名称与构造函数的名称相对应。

但是要获取对象的class值的唯一方法是必须调用object对象定义默认的toString方法。因为不同对象都会预定义自己的toString方法,所以不能直接用对象的toString方法。例如,下面对象的toString方法返回的就是当前UTC时间字符串,而不是字符串“[object Date]”。

var date = new Date();

alert(date.toString()); //当前UTC时间字符串

要调用object对象默认的toString方法,可以先调用Object.prototype.toString对象的默认toString()方法,再调用apply在想要检测的对象上执行。结合上面的对象date,具体实现代码如下:

var date = new Date();

var s = Object.prototype.toString;

alert(s.apply(date));//[object Date]

下面是一个比较完整的数据类型校验:

“` python

function typeof(o){

var _toString = Object.prototype.toString;

var _type = {

“undefined”:”undefined”,

“number”:”number”,

“string”:”string”,

“[object Function]”:”function”,

“[object Array]”:”array”,

“[object RegExp]”:”regexp”,

“[object Date]”:”date”,

“[object Error]”:”error”

}

return _type[typeof o] || _type[_toString.call(o) || (o?”object”:”null”)];

}

上述方法适用于JavaScript基本数据类型和内置对象,而对自定义对象是无效的。要检测非内置对象,只能够使用constructor属性和instaceof运算符来实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息