JavaScript数据类型判断typeof函数
下面我们来介绍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>