判断js对象的数据类型,有没有一个最完美的方法?
2016-01-19 10:21
861 查看
先来一个例子:
Javascript代码
var string1="";
var string2=new String("");
alert(typeof string1); // string
alert(typeof string2); // object
alert(string1 instanceof String); // false
alert(string2 instanceof String); // true
哦,我的天,难道要这样来判断:
Javascript代码
typeof str == "string" || str instanceof String
其实我还想告诉你一件关于instanceof的故事:
父页面 parent.html
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代码
<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对象里的。这样一来使用起来真的很不舒服。
下面要介绍一个方法可以解决以上提出的问题:
Javascript代码
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不会出错):
Javascript代码
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
Javascript代码
var string1="";
var string2=new String("");
alert(typeof string1); // string
alert(typeof string2); // object
alert(string1 instanceof String); // false
alert(string2 instanceof String); // true
哦,我的天,难道要这样来判断:
Javascript代码
typeof str == "string" || str instanceof String
其实我还想告诉你一件关于instanceof的故事:
父页面 parent.html
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代码
<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对象里的。这样一来使用起来真的很不舒服。
下面要介绍一个方法可以解决以上提出的问题:
Javascript代码
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不会出错):
Javascript代码
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
相关文章推荐
- JSONOjbect,对各种属性的处理
- javascript的学习路子
- JSTL中c:set标签的用法
- 界面显示这个时间格式的js代码: 2016年1月19日 星期二 乙未(羊)年 腊月初十
- js-格式化数字保留两位小数-带千分符
- 开始JavaScript
- 学习JavaScript设计模式之装饰者模式
- //普通字符串转JSON字符串转字典
- jstl标签
- 了解JavaScript
- 浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
- 关于使用JSONKit一直崩溃
- JS常用小技巧
- js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
- jsp
- 图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
- 排序—归并排序(js实现)
- JavaScript两大支柱-PART1:如何逃脱第七层地狱(译)
- 浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
- 浅谈 JS中的数据类型