判断js对象的数据类型,有没有一个最完美的方法?

本文通过实例展示了JavaScript中字符串类型的两种创建方式及其类型判断的区别,并深入探讨了使用typeof和instanceof关键字进行类型检查的局限性及解决方案。尤其是在不同窗口环境下的类型检测问题。

先来一个例子:

Javascript代码  收藏代码
  1. var string1="";  
  2. var string2=new String("");  
  3. alert(typeof string1); // string  
  4. alert(typeof string2); // object  
  5. alert(string1 instanceof String); // false  
  6. alert(string2 instanceof String); // true  


哦,我的天,难道要这样来判断:

Javascript代码  收藏代码
  1. typeof str == "string" || str instanceof String  


其实我还想告诉你一件关于instanceof的故事:
父页面 parent.html

Html代码  收藏代码
  1. <HTML>  
  2.  <HEAD>  
  3.   <TITLE> New Document </TITLE>  
  4.  </HEAD>  
  5.  <BODY>  
  6.   <iframe id="testFrame" src="about:blank"></iframe>  
  7.  </BODY>  
  8. </HTML>  
  9. <SCRIPT LANGUAGE="JavaScript">  
  10. <!--  
  11.     var str=new String("");  
  12.     document.getElementById("testFrame").src="child.html";  
  13. //-->  
  14. </SCRIPT>  


子页面 child.html

Html代码  收藏代码
  1. <HTML>  
  2.  <HEAD>  
  3.   <TITLE> New Document </TITLE>  
  4.  </HEAD>  
  5.  <BODY>  
  6.     child  
  7.  </BODY>  
  8. </HTML>  
  9. <SCRIPT LANGUAGE="JavaScript">  
  10. <!--  
  11.     alert(parent.str instanceof String); // false  
  12.     alert(parent.str instanceof parent.String); // true  
  13. //-->  
  14. </SCRIPT>  


父页面的String类与子页面的String类是不同的类(姑且称之为类),所以使用关键字instanceof来判断一个对象的时候特别要注意这个对象是在哪个window对象里的。这样一来使用起来真的很不舒服。
下面要介绍一个方法可以解决以上提出的问题:

Javascript代码  收藏代码
  1. function type(obj){  
  2.     switch(obj){  
  3.         case null:  
  4.             return "null";  
  5.         case undefined:  
  6.             return "undefined";  
  7.     }  
  8.     var s=Object.prototype.toString.call(obj);  
  9.     switch(s){  
  10.         case "[object String]":  
  11.             return "string";  
  12.         case "[object Number]":  
  13.             return "number";  
  14.         case "[object Boolean]":  
  15.             return "boolean";  
  16.         case "[object Array]":  
  17.             return "array";  
  18.         case "[object Date]":  
  19.             return "date";  
  20.         case "[object Function]":  
  21.             return "function";  
  22.         case "[object RegExp]":  
  23.             return "regExp";  
  24.         case "[object Object]":  
  25.             return "object";  
  26.         default:  
  27.             return "object";  
  28.     }  
  29. }  


问题又来了,这个方法在iframe、window.showModalDialog模式中运行的很好,但是在window.open模式下面却会出错(IE6环境下会出错,IE7 IE8没有试过。firefox不会出错):

Javascript代码  收藏代码
  1. alert(opener.str instanceof opener.String); // 报js错误 "缺少函数"  
  2. alert(Object.prototype.toString.call(opener.str)); // [object Object]  
  3. alert(opener.Object.prototype.toString.call(opener.str)); // [object String] 需要在Object前加上opener  


哪位高手来帮我解决一下这个问题啊??郁闷那,难道要向type方法传递一个window参数,太麻烦了
附上html文件,parent.html中定义了mode参数,分别是1、2、3代表三种模式(见注释),测试时运行parent.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值