先来一个例子:

  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. Sql语句不等于空

    对于这种有null的我一般用这样的句子 isnull(Tag,'') <> '文章' 这样就可以搞定了不管是字符还是数字都可以用 <>

  2. oracle中的赋权

    1 怎么给用户赋权限 grant create view to scott; (create view 是权限的名称) 2 怎么给用户撤销权限 revoke create view from scot ...

  3. rowcommand事件中获取控件

    //根据当前按钮生成命名空间 protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)        ...

  4. 微信公众号系列 --- ionic在IOS的键盘弹出问题

    在使用ionic开发IOS系统微信的时候会有一个苦恼的问题,填写表单的时候键盘会挡住输入框,其实并不算什么大问题,只要用户输入一个字就可以立刻看见输入框了. 可惜的是,有些客户是不讲理的,他才不管这个 ...

  5. ARMs3c2440开发板挂接NFS服务

    1.修改IP地址,使虚拟机,电脑PC机.开发板位于同一个网段,开发板网线与电脑网络接口连接,如PC:ip 192.168.0.112 255.255.255.0 虚拟机 192.168.0.8 255 ...

  6. CodeForces 139C Literature Lesson(模拟)

    这个题,读懂了就是水,读不懂就没办法下手,论英语阅读的重要性...只有五种形式,第一种万能型aaaa,是另外3种的特殊情况,第二种克莱里林四行打油诗aabb形式,第三种是交替的abab形式,第四种是封 ...

  7. HDU 2176 取(m堆)石子游戏(尼姆博奕)

    nim基础博弈 #include<stdio.h> #include<iostream> #include<cstring> #include<queue&g ...

  8. DWR Annotations

    DWR   Annotations DWR 标注是用来代替 dwr.xml 或者与其一同工作的. 1.初始配置 <servlet> <description>DWR contr ...

  9. .NET反射应用

    .Net中,在编写框架时,反射是最长用的一个知识点,在这举个小例子,旨在说明反射如何应用:本文只程序中只涉及到System.Type的应用,通过这个类可以访问关于任何数据类型的信息,注释部分涉及到Sy ...

  10. Bootstrap环境及屏幕适配-(一)

    一.环境搭建 1.目录结构 需要引用的文件有, jquery.js.bootstrap.min.js 和 bootstrap.min.css 文件,下面看下在线的文档Hello Word <!D ...