网站地图    收藏   

主页 > 前端 > javascript >

JavaScript数据类型判断typeof函数

来源:自学PHP网    时间:2014-09-19 14:47 作者: 阅读:

[导读] 下面我们来介绍js中的数据类型判断函数,有需要了解的机友可参考参考。...

typeof方法,比如:

 代码如下 复制代码

<STRONG><script type="text/javascript">
//<![CDATA[
var a=[0];
document.write(isArray(a),'<br/>');
function isArray(obj){
return (typeof obj=='object')&&obj.constructor==Array;
}
//]]>
</script></STRONG>

但是,该方法在一些浏览器中并不是像我们想像的那样工作。

1、Firefox2和Firefox3
在这两个浏览器中,用typeof检测HTML对象元素的类型,得到是一个不精确的“function”结果,而不是“object”,如HTMLDocument。如:


alert(typeof HTMLDocument);
//在Firefox2中结果是"function";
//在Firefox3中结果是"object";

2、Firefox2
对于正则表达式,在该浏览器中返回的结果是“function”(在Firefox3中结果是“object”),如:


var reg = /test/;
alert(typeof reg);
//在Firefox2中结果是"function";
//在Firefox3中结果是"object";

注:本人在safari中测试,其结果也是“function”。
3、IE6和IE7
在IE中对DOM元素使用typeof方法,得到的结果是“object”。如:


alert(typeof document.getElementsByTagName("body")[0].getAttribute);
//结果是"object"

4、Safari 3
safari认为DOM元素的NodeList是一个函数,如:


alert(typeof document.body.childNodes);
//结果是"function"

很明显,如果你要测试一个对象是否为函数,使用typeof方法并不能从真正意义上保证测试结果。那么,我们就需要一种在所有浏览器中都能保证测试结果的解决方案。我们知道function本身有apply()和call()两种方法,但这两个方法在IE中存在问题的函数中并不存在,试试下面的测试:


alert(typeof document.getElementsByTagName("body")[0].getAttribute.call)
//在IE中结果是"undefined"

显然,我们不能利用这两个方法。

1.isUndefined 与 使用全等(===)或typeof 多了一层函数调用。很明显多一层函数调用比直接使用原生的运算符效率会低(虽然有些微不足道),但如果isUndefined调用次数很多如上万次还是很 明显的。我曾经在邮箱框架中加入了该函数,调用次数有4000多次,从性能分析工具看占用了近1%的时间。仅仅一个判断占1%的调用时间还是很可怕的。当 然,邮箱框架内的isUndefined处在多层闭包的顶层,访问其也会占用较多时间。如果这一条还不足以让你放弃isUndefined,

2.函数从一定程度上是对一些代码的封装,抽象。是组织良好代码的方式之一,且有利于降低代码的复杂性。但isNull/isUndefined/isBoolean/isNumber/isString函数内仅有一句,抽象层次很低。因此完全不必封装而提取出一个函数。

3.isUndefined(a) 与 a === undefined相比并不会节省几个字节(呵,你可以命名的更短但损失了可读性)。

 代码如下 复制代码

isNull: function(a){
 return a === null;
},
isUndefined: function(a){
 return a === undefined;
},
isNumber: function(a){
 return typeof a === 'number';
},
isString: function(a){
 return typeof a === 'string';
},
isBoolean: function(a){
 return typeof a === 'boolean';
},
isPrimitive: function(b){
 var a = typeof b;
 return !!(b === undefined || b === null || a == 'boolean' || a == 'number' || a == 'string');  
},
isArray: function(a){
 return proto_obj.toString.call(a) === '[object Array]';
},
isFunction: function(a){
 return proto_obj.toString.call(a) === '[object Function]';
},
isPlainObject: function(o){
 if (!o || o === win || o === doc || o === doc.body) {
  return false;
 }
 return 'isPrototypeOf' in o && proto_obj.toString.call(o) === '[object Object]';  
},
isWindow: function(o){
 return o && typeof o === 'object' && 'setInterval' in o;
},
isEmptyObject: function(o){
    for(var a in o) {
 return false;
    }
    return true;
}

附上一个朋友写的

 1 判断是否为数组类型

 

 代码如下 复制代码
<script type="text/javascript">
//<![CDATA[
var a=[0];
document.write(isArray(a),'<br/>');
function isArray(obj){
return (typeof obj=='object')&&obj.constructor==Array;
}
//]]>
</script>


2 判断是否为字符串类型

 代码如下 复制代码

 

<script type="text/javascript">
//<![CDATA[
document.write(isString('test'),'<br/>');
document.write(isString(10),'<br/>');
function isString(str){
return (typeof str=='string')&&str.constructor==String;
}
//]]>
</script>
 

3 判断是否为数值类型

 代码如下 复制代码

 

<script type="text/javascript">
//<![CDATA[
document.write(isNumber('test'),'<br/>');
document.write(isNumber(10),'<br/>');
function isNumber(obj){
return (typeof obj=='number')&&obj.constructor==Number;
}
//]]>
</script>
 

4 判断是否为日期类型

 

 代码如下 复制代码
<script type="text/javascript">
//<![CDATA[
document.write(isDate(new Date()),'<br/>');
document.write(isDate(10),'<br/>');
function isDate(obj){
return (typeof obj=='object')&&obj.constructor==Date;
}
//]]>
</script>

 

5 判断是否为函数

 

 代码如下 复制代码
 
<script type="text/javascript">
//<![CDATA[
document.write(isFunction(function test(){}),'<br/>');
document.write(isFunction(10),'<br/>');
function isFunction(obj){
return (typeof obj=='function')&&obj.constructor==Function;
}
//]]>
</script>
 

6 判断是否为对象

 代码如下 复制代码

<script type="text/javascript">
linenum
//<![CDATA[
document.write(isObject(new Object()),'<br/>');
document.write(isObject(10),'<br/>');
function isObject(obj){
return (typeof obj=='object')&&obj.constructor==Object;
}
//]]>
</script>

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论