手机版

用例子说明如何判断JavaScript中对象的类型

时间:2021-11-03 来源:互联网 编辑:宝哥软件园 浏览:

在编写js程序的过程中,可能经常需要判断一个对象的类型。比如写一个函数,需要判断不同的参数类型才能写出不同的代码。首先想到的可能是操作员的类型。请看下面的例子:

脚本类型=' text/JavaScript ' var object={ };var b=真;警报(对象类型为“”,b类型为);/script的结果如下:

2016422170645689.png  (377220)

从上面的结果可以看出,一个对象的类型可以用typeof运算符来显示,那么typeof运算符的作用域为null且未定义会是什么结果呢?

/* var object={ };var b=真;警报(对象类型为“”,b类型为);*/alert(类型为null ' '类型为undefined)2016422170716617.png  (239143)

类型运算符作用于null,实际上显示“object”(这似乎不科学,我以为它会显示“null”),作用于undefined,显示“undefined”(这符合我们期望的结果)。因此,在使用typeof运算符判断一个对象的类型时,我们要特别小心,因为这个对象可能是null。以上只给出了typeof作用于这些对象的一些结果,下表列出了typeof运算符作用于boolean、number、string、array、date、regexp、object、function、null、undefined(感兴趣的读者可以自行测试):的结果。

2016422170736411.png  (504291)

从上表的结果可以看出,Array、Date、RegExp都显示对象,那么为什么不直接显示对象的类型呢?这就引出了js的另一个运算符,instanceof运算符,用来判断一个对象是否属于某一类型,计算出来的值是真还是假。我们先来看看:

var now=新日期();var模式=/^[\s\s]*$/;var name=[' zq ',' John '];警报((现在是日期的实例)' '(正则表达式的模式实例)' '(数组的名称实例));2016422170805336.png  (385281)

很明显,这个instanceof可以判断一个对象的类型,但是这个只能判断除了基本类型(包括String类型)以外的其他类型,但是不能判断基本类型。然而,实例并不总能得到正常的判断。考虑一帧的情况,要判断其类型的对象是另一帧传递的对象,首先看下面的例子。main.html

!doctype html html lang=' en ' head title main/title/head frameset cols=' 45%,* ' frame name=' frame 1 ' src=' http : frame 1 . html '/frame name=' frame 2 ' src=' http : frame 2 . html '/frame set/html frame1.html

!doctype html html lang=' en ' head meta charset=' UTF-8 ' title frame 1/title/head script type=' text/JavaScript ' var name=[' riccio Zhang ',' zq ',' John '];/script body style=' background : # CCC '/body/html frame2.html

!doctype html html lang=' en ' head meta charset=' UTF-8 ' title frame 2/title script type=' text/JavaScript ' document . write(' top . frame 1 . names instance of Array : '(top . frame 1 . names instance of Array));document . write(' br/');document . write(' top . frame 1 . name instance of top . frame 1 . array : '(top . frame 1 . name instance of top . frame 1 . array));document . write(' br/');document . write(' top . frame 1 . array===top . frame 2 . array '?(top . frame 1 . array===top . frame 2 . array));/script/head body style=' background : # 747474 '/body/html2016422170849229.png  (1365215)

names对象位于frame1框架中,此时它是通过frame1框架的Array创建的。如果将names对象带到frame2的Array中进行比较,很明显names不是frame2中Array的一个实例,因为frame1和frame2与Array完全不同。从第二个实际结果可以清楚地看到,names是它所在的框架的一个实例,从第三个输出可以看出,frame1的Array不同于frame2的Array。那么,当我遇到上述跨帧比较时,该怎么办呢?我们不能每次都比较帧对应的数组。有必要的方法来解决上述问题。请看下面的代码:

var toString={}。toStringvar now=新日期();警报(现在呼叫)2016422170910729.png  (345186)

{}.转换对象为字符串表示获取目标对象上的转换对象为字符串方法(这个方法时目标对象的基本方法之一),toString.call(现在)表示调用转换对象为字符串方法。调用日期对象最原生的toString()(这个方法是目标上面的方法)方法可以显示[对象日期]类型的字符串,假如是数组,则会产生[对象数组]的字样,也就是说进行上面的操作会显示类似[对象类]的字样,那么我们只要判断这个字符串不就可以知道其类型了吗?由此可以写出如下的工具类:tools.js

var tools=(function(undefined){ var class 2 type={ },toString={} .toStringvar fun={ type : function(obj){ return obj===null | | obj===undefined?string(obj): class 2类型[tostring。调用(obj)],isarray :函数(obj){返回乐趣。type(obj)=' array ';},isFunction:函数{回报乐趣。type(obj)===' function ';},每个:函数(arr,回调){ var i=0,hasLength=arr.length?真:假;if(!回调||(回调类型!=='function') ||!hasLength){ return;} for(I=0;一、长度;i ){ if(callback.call(arr[i],I,arr[I])===false){ break;} } } };' fun .每个('布尔数字字符串数组日期正则表达式对象函数。split('),function(i,name){ class 2 type['[object ' name ']']=name。tolowercase();});回报乐趣;})();工具提供了类型,数组,函数等方法用来判断对象的类型,根据实际的需要可以自己添加需要判断类型的方法类型。接受一个目标文件参数,它将对象的实际类型以小写的形式返回,比如你的需要判断对象的类型是数组,那么此方法将会返回数组。根据上面提供的工具类,再重新改写上面的例子:fram2.html

!doctype html html lang=' en ' head meta charset=' UTF-8 ' title frame 2/title script type=' text/JavaScript ' src=' http : tools。js '/script脚本类型=' text/JavaScript '文档。write(' top。第一帧。命名数组3360’的实例(顶部。第一帧。数组的名称实例));文件。write('(br/');文件。write(' top。第一帧。top的名称实例。第一帧。阵列:’(顶部。第一帧。top的名称实例。第一帧。数组));文件。write('(br/');文件。write(' top。第一帧。array===top。第二帧。数组?(上。第一帧。array===top。第二帧。数组));文件。write('(br/');文件。write('工具。isarray(顶部。第一帧。名称)?工具。isarray(顶部。第一帧。姓名));/script/head body style=' background : # 747474 '/body/html(9506 . 163.com)

至此通过上面的根据类就可以很容易的判断对象的类型了。注意:在工业管理学(工业工程)中例如像警报这样的元素是不能判断的。

版权声明:用例子说明如何判断JavaScript中对象的类型是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。