您的位置:首页 > Web前端 > JavaScript

判断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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: