zoukankan      html  css  js  c++  java
  • 判断js对象的数据类型,有没有一个最完美的方法?

    先来一个例子:

    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

  • 相关阅读:
    C语言编译多文件
    vs(visual studio 2019)恢复默认设置
    everything 有文件搜不到
    potplayer显示右侧插入列表消息
    ubuntu 关机、重启命令
    post&get请求总结
    C# string格式的日期时间字符串转为DateTime类型
    css position: absolute、relative详解
    在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求
    ASP.NET获取客户端及服务器的信息
  • 原文地址:https://www.cnblogs.com/koleyang/p/5141362.html
Copyright © 2011-2022 走看看