A-A+

JavaScript数据类型判断typeof函数

2016年02月19日 web前端设计 暂无评论 阅读 6 views 次

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

typeof方法,比如,代码如下:

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

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

1、Firefox2和Firefox3

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

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

2、Firefox2

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

  1. var reg = /test/;   
  2. alert(typeof reg);   
  3. //在Firefox2中结果是"function";   
  4. //在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相比并不会节省几个字节(呵,你可以命名的更短但损失了可读性)。

例,代码如下:

  1. isNull: function(a){  
  2.  return a === null;  
  3. },  
  4. isUndefined: function(a){  
  5.  return a === undefined;  
  6. },  
  7. isNumber: function(a){  
  8.  return typeof a === 'number';  
  9. },  
  10. isString: function(a){  
  11.  return typeof a === 'string';  
  12. },  
  13. isBoolean: function(a){  
  14.  return typeof a === 'boolean';  
  15. },  
  16. isPrimitive: function(b){  
  17.  var a = typeof b;  
  18.  return !!(b === undefined || b === null || a == 'boolean' || a == 'number' || a == 'string');    
  19. },  
  20. isArray: function(a){  
  21.  return proto_obj.toString.call(a) === '[object Array]';  
  22. },  
  23. isFunction: function(a){  
  24.  return proto_obj.toString.call(a) === '[object Function]';  
  25. },  
  26. isPlainObject: function(o){  
  27.  if (!o || o === win || o === doc || o === doc.body) {  
  28.   return false;  
  29.  }  
  30.  return 'isPrototypeOf' in o && proto_obj.toString.call(o) === '[object Object]';    
  31. },  
  32. isWindow: function(o){  
  33.  return o && typeof o === 'object' && 'setInterval' in o;  
  34. },  
  35. isEmptyObject: function(o){  
  36.     for(var a in o) {  
  37.  return false;  
  38.     }  
  39.     return true;  
  40. }  

附上一个朋友写的.

1 判断是否为数组类型,代码如下:

  1. <script type="text/javascript">   
  2. //<![CDATA[   
  3. var a=[0];   
  4. document.write(isArray(a),'<br/>');   
  5. function isArray(obj){   
  6. return (typeof obj=='object')&&obj.constructor==Array;   
  7. }   
  8. //]]>   
  9. </script>  

2 判断是否为字符串类型,代码如下:

  1. <script type="text/javascript">   
  2. //<![CDATA[   
  3. document.write(isString('test'),'<br/>');   
  4. document.write(isString(10),'<br/>');   
  5. function isString(str){   
  6. return (typeof str=='string')&&str.constructor==String;   
  7. }   
  8. //]]>   
  9. </script>  

3 判断是否为数值类型,代码如下:

  1. <script type="text/javascript">   
  2. //<![CDATA[   
  3. document.write(isNumber('test'),'<br/>');   
  4. document.write(isNumber(10),'<br/>');   
  5. function isNumber(obj){   
  6. return (typeof obj=='number')&&obj.constructor==Number;   
  7. }   
  8. //]]>   
  9. </script>  

4 判断是否为日期类型,代码如下:

  1. <script type="text/javascript">   
  2. //<![CDATA[   
  3. document.write(isDate(new Date()),'<br/>');   
  4. document.write(isDate(10),'<br/>');   
  5. function isDate(obj){   
  6. return (typeof obj=='object')&&obj.constructor==Date;   
  7. }   
  8. //]]>   
  9. </script>  

5 判断是否为函数,代码如下:

  1. <script type="text/javascript">   
  2. //<![CDATA[   
  3. document.write(isFunction(function test(){}),'<br/>');   
  4. document.write(isFunction(10),'<br/>');   
  5. function isFunction(obj){   
  6. return (typeof obj=='function')&&obj.constructor==Function;   
  7. }   
  8. //]]>   
  9. </script>  

6 判断是否为对象,代码如下:

  1. <script type="text/javascript">  
  2. linenum  
  3. //<![CDATA[   
  4. document.write(isObject(new Object()),'<br/>');   
  5. document.write(isObject(10),'<br/>');   
  6. function isObject(obj){   
  7. return (typeof obj=='object')&&obj.constructor==Object;   
  8. }   
  9. //]]>   
  10. </script>  
标签:

给我留言