先来一个例子:

  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

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

  1. typeof str == "string" || str instanceof String

其实我还想告诉你一件关于instanceof的故事:

父页面 parent.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

  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对象里的。这样一来使用起来真的很不舒服。

下面要介绍一个方法可以解决以上提出的问题:

  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不会出错):

  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

判断js对象的数据类型,有没有一个最完美的方法?的更多相关文章

  1. 判断js对象是否拥有某一个属性的js代码

    js对象是否拥有某一个属性的判断方法有很多. 本文分享一个简单的方法,如下: <script> /** * 判断js对象是否具有某属性 * by www.jbxue.com */ var ...

  2. 如何判断js中的数据类型?

    js六大数据类型:number.string.object.Boolean.null.undefined string: 由单引号或双引号来说明,如"string" number: ...

  3. 判断js中的数据类型的几种方法

    判断js中的数据类型有一下几种方法:typeof.instanceof. constructor. prototype. $.type()/jquery.type(),接下来主要比较一下这几种方法的异 ...

  4. 转:判断js中的数据类型的几种方法

    判断js中的数据类型有一下几种方法:typeof.instanceof. constructor. prototype. $.type()/jquery.type(),接下来主要比较一下这几种方法的异 ...

  5. 如何判断js中的数据类型

    如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...

  6. [转]如何判断js中的数据类型

    原文地址:http://blog.sina.com.cn/s/blog_51048da70101grz6.html 如何判断js中的数据类型:typeof.instanceof. constructo ...

  7. 如何判断js中的数据类型(转)

    如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...

  8. 判断js中的数据类型

    如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...

  9. 判断JS对象是否拥有某属性的方法举例

    判断JS对象是否拥有某属性 JS是否拥有某属性的判断方法,这里提供两种方式,供大家参考. 1.in 运算符 var obj = {name:'jack'}; alert('name' in obj); ...

随机推荐

  1. 12C 连接方式和 Oracle Easy Connect Naming method

    1.12C 连接方式 PDB is not an instance, so using SID in the connection string will not work. When the dat ...

  2. css居中

    <html><head lang="en"> <meta charset="UTF-8"> <title>< ...

  3. CenOS 用PF_RING优化Snort

    0.优化顺序 安装PF_RING的kernel模块 安装PF_RING的用户态库 安装Snort的DAQ 安装PF_RING的pfring-daq-module 安装snort 安装PF_RING-a ...

  4. FTP 1.0

    自己写的可以实现文件的下载(必须自己知道文件名),还有很多要优化. 譬如:不能看可以下载的文件,输入错误无法处理,不能处理多个用户,每次只能下载一个结束,服务器没有完成守护进程:没有用函数封装,简化m ...

  5. Struts2利用注解实现action跳转

    使用注解来配置Action的最大好处就是可以实现零配置,但是事务都是有利有弊的,使用方便,维护起来就没那么方便了. 要使用注解方式,我们必须添加一个额外包:struts2-convention-plu ...

  6. Mac系统中各个文件夹简单介绍(转)

    一.说明: Mac OS X,这是一个基于UNIX核心的系统,增强了系统的稳定性.性能以及响应能力.它能通过对称多处理技术充分发挥双处理器的优势,提供无与伦比的2D.3D和多媒体图形性能以及广泛的字体 ...

  7. Monkey and Banana(基础DP)

    Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  8. Windows Server 2012 在个人终端上使用的推荐设置

    Windows Server 2012,也就是 Windows 8 的服务器版本,相对于 Windows 8 企业版而言,增强了作为服务器的功能,弱化了作为终端系统的功能. 目前微软官方提供了 Win ...

  9. 转 linux目录介绍

    以下用一个表格来罗列linux默认的目录或文件及其用途: 目录/文件 用途 来源 / /处于Linux文件系统树形结构的最顶端,它是Linux文件系统的入口,所有的目录.文件.设备都在/之下. - / ...

  10. JSP/JAVA目录清单

    JAVA253中国象棋(CS) JAVA258网络五子棋游戏的设计与实现(CS) JAVA390停车场管理系统SQL(CS) JSP001学生综合素质测评系统JAVA+Mysql JSP002学生成绩 ...