判断js对象的数据类型,有没有一个最完美的方法?
先来一个例子:
- var string1="";
- var string2=new String("");
- alert(typeof string1); // string
- alert(typeof string2); // object
- alert(string1 instanceof String); // false
- alert(string2 instanceof String); // true
哦,我的天,难道要这样来判断:
- typeof str == "string" || str instanceof String
其实我还想告诉你一件关于instanceof的故事:
父页面 parent.html
- <HTML>
- <HEAD>
- <TITLE> New Document </TITLE>
- </HEAD>
- <BODY>
- <iframe id="testFrame" src="about:blank"></iframe>
- </BODY>
- </HTML>
- <SCRIPT LANGUAGE="JavaScript">
- <!--
- var str=new String("");
- document.getElementById("testFrame").src="child.html";
- //-->
- </SCRIPT>
子页面 child.html
- <HTML>
- <HEAD>
- <TITLE> New Document </TITLE>
- </HEAD>
- <BODY>
- child
- </BODY>
- </HTML>
- <SCRIPT LANGUAGE="JavaScript">
- <!--
- alert(parent.str instanceof String); // false
- alert(parent.str instanceof parent.String); // true
- //-->
- </SCRIPT>
父页面的String类与子页面的String类是不同的类(姑且称之为类),所以使用关键字instanceof来判断一个对象的时候特别要注意这个对象是在哪个window对象里的。这样一来使用起来真的很不舒服。
下面要介绍一个方法可以解决以上提出的问题:
- function type(obj){
- switch(obj){
- case null:
- return "null";
- case undefined:
- return "undefined";
- }
- var s=Object.prototype.toString.call(obj);
- switch(s){
- case "[object String]":
- return "string";
- case "[object Number]":
- return "number";
- case "[object Boolean]":
- return "boolean";
- case "[object Array]":
- return "array";
- case "[object Date]":
- return "date";
- case "[object Function]":
- return "function";
- case "[object RegExp]":
- return "regExp";
- case "[object Object]":
- return "object";
- default:
- return "object";
- }
- }
问题又来了,这个方法在iframe、window.showModalDialog模式中运行的很好,但是在window.open模式下面却会出错(IE6环境下会出错,IE7 IE8没有试过。firefox不会出错):
- alert(opener.str instanceof opener.String); // 报js错误 "缺少函数"
- alert(Object.prototype.toString.call(opener.str)); // [object Object]
- alert(opener.Object.prototype.toString.call(opener.str)); // [object String] 需要在Object前加上opener
哪位高手来帮我解决一下这个问题啊??郁闷那,难道要向type方法传递一个window参数,太麻烦了
附上html文件,parent.html中定义了mode参数,分别是1、2、3代表三种模式(见注释),测试时运行parent.html
判断js对象的数据类型,有没有一个最完美的方法?的更多相关文章
- 判断js对象是否拥有某一个属性的js代码
js对象是否拥有某一个属性的判断方法有很多. 本文分享一个简单的方法,如下: <script> /** * 判断js对象是否具有某属性 * by www.jbxue.com */ var ...
- 如何判断js中的数据类型?
js六大数据类型:number.string.object.Boolean.null.undefined string: 由单引号或双引号来说明,如"string" number: ...
- 判断js中的数据类型的几种方法
判断js中的数据类型有一下几种方法:typeof.instanceof. constructor. prototype. $.type()/jquery.type(),接下来主要比较一下这几种方法的异 ...
- 转:判断js中的数据类型的几种方法
判断js中的数据类型有一下几种方法:typeof.instanceof. constructor. prototype. $.type()/jquery.type(),接下来主要比较一下这几种方法的异 ...
- 如何判断js中的数据类型
如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...
- [转]如何判断js中的数据类型
原文地址:http://blog.sina.com.cn/s/blog_51048da70101grz6.html 如何判断js中的数据类型:typeof.instanceof. constructo ...
- 如何判断js中的数据类型(转)
如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...
- 判断js中的数据类型
如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...
- 判断JS对象是否拥有某属性的方法举例
判断JS对象是否拥有某属性 JS是否拥有某属性的判断方法,这里提供两种方式,供大家参考. 1.in 运算符 var obj = {name:'jack'}; alert('name' in obj); ...
随机推荐
- Fusioncharts图表组件API参考方法(Functions)汇总篇(续)
[摘要]: chartType()FusionCharts的JavaScript类API提供了大量的功能.下面的列表显示在每个功能的详细信息: 一.FusionCharts的类 - 实例功能 1.co ...
- 设计一个 iOS 控件
转载自:http://blog.csdn.net/zhangao0086/article/details/45622875 代码的等级:可编译.可运行.可测试.可读.可维护.可复用 前言 一个控件从外 ...
- 一个combineInputformat
mark import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import org.apa ...
- 第三方框架ViewPagerIndicator引入到Android Studio的方法总结
原创文章,转载请注明出处http://www.cnblogs.com/baipengzhan/p/6286619.html 第三方框架ViewPagerIndicator实现的效果比较好,但当我们从G ...
- JAVA基础--IO流
数据流的方向: 输入流, 输出流 数据单位: 字节流, 字符流 功能不同: 节点流, 处理流 JDK提供的4种抽象流: 输入流: 字节流(InputStream), 字符流(Reader) , 站在程 ...
- Highcharts选项配置详细说明文档
Highcharts提供大量的选项配置参数,您可以轻松定制符合用户要求的图表,目前官网只提供英文版的开发配置说明文档,而中文版的文档网上甚少,且零散不全.这里,我把Highcharts常用的最核心的参 ...
- CSS——z-index
1.特性 ①z-index的值表示谁压着谁.值大的压住值小的. ②只有定位的元素才有z-index 值,也就是说,浮动不可以,相对定位,绝对定位,固定定位都可以. ③z-index值没有单位,是一个正 ...
- chart.js在html中画曲线图
http://www.bootcss.com/p/chart.js/docs/ http://www.chartjs.org/docs/ 中有详细讲解 一.简介 Chart.js是一个基于HTML ...
- 在阿里云ECS(CentOS6.5)上安装jdk
JDK安装 在安装前先确定服务器上没有安装过JDK 命令: java -version 结果: 查看所有java安装包 命令: yum -y list java* 结果: 选择安装所需要的JDK 命令 ...
- spring 自动化构建项目
STS 3.7.0.RELEASE http://spring.io/tools/sts/legacy