JavaScript用构造函数如何获取变量的类型名
使用类型获取基本的类型
看到题目的第一眼,有些同学可能会想到类型运算符,在Java脚本语言语言中,给出了使用类型运算符来获取基本的类型名。(注意不是基本类型)
这是类型的全部用法
01-typeof.htm
控制台。log(' type of of 10 ~ ~ ~ ~ ' type of 10);控制台。日志(' a '的类型为~ ~ ~'a '的类型为);控制台。log(' type of of true ~ ~ ~ ~ ' type of true);控制台。日志(“{ type of { } ~ ~ ~”type of { });控制台。log('类型为/123/~ ~ ' '类型为/123/);控制台。log(' type of function(){ } ~ ~ ' type of function(){ });控制台。log('的类型为undefined ~ ~ ~ ~ '的类型为undefined);控制台。log('类型为null ~ ~ ~ ~ '类型为null);这是结果
按照上面的打印结果,总结出下面要注意的几点
类型(引用类型)除了函数,都是对象,比如类型/123/
空的类型为"对象"
未定义的类型为'未定义,通常,如果使用两等号,null==未定义为真。
转换为数字的常见用法'10'-0, 如果没有转换成功,返回NaN,由于圆盘烤饼的一个特性: NaN!=NaN,故判断转换成功与否的常见做法: (这也是我参见jQuery的源码发现的,jQuery源码读100遍都不为过)
(' 10x '-0)==(' 10x '-0);//结果为假!
使用jQuery中的方法$.类型()
现在看看jQuery是怎么做的
//先申明一个对象,目的是用来做映射var类2类型={ };//申明一个core_toString()的方法,得到最原始的toString()方法,因为在很多对象中,toStrintg()已经被重写var core _ toString()=class 2类型。toString//这里为toStrintg()后的结果和类型名做一个映射,申明一个core_toString()后的结果,而值就是类型名每个('布尔数字字符串函数数组日期正则表达式对象错误。split('),function(i,name){ class 2 type['[object ' name ']']=name。tolowercase();});因为Object.prototype.toString()方法调用结果如下
var core_toString={} .toStringconsole。日志(core _ tostring。call(1));控制台。日志(core _ tostring。call(' 11 ');控制台。日志(core _ tostring。call(/123/);控制台。日志(core _ tostring。调用({ });控制台。日志(core _ tostring。调用(function(){ });控制台。日志(core _ tostring。call([]);控制台。日志(core _ tostring。call(true));控制台。日志(core _ tostring。call(new Date()));控制台。日志(core _ tostring。调用(新的Error());控制台。日志(core _ tostring。call(null));console.log(core_toString.call(未定义));console.log(字符串(空));console.log(字符串(未定义));
上面的打印结果与
第2类类型['对象name ']']=name。tolowercase();不谋而合!
这是jQuery.type的核心方法
:型函数(obj){ if(obj==null){ return String(obj);}//支持: Safari=5.1(functionish RegExp)返回类型obj==='object' ||类型obj==='函数'?类2类型[core _ ToString。调用(obj)]| |“object”:类型的obj;},注意,为什么把空或者不明确的单独讨论呢,因为在一些版本浏览器中
控制台。日志(core _ tostring。call(null));console.log(core_toString.call(未定义));这是会报错的!
如果是对象类型,另:由于在一些低版本的浏览器中,类型/123/会返回的是"功能"而不是对象,所以这里要判断是否是函数,要明白这里的obj===函数的类型不是为了函数讨论的,因为函数本身就可以通过类型来得到类型。
obj===' object '的类型| obj===' function '的类型?类2类型[core _ ToString。调用(obj)]就直接返回class2type中键值对的结果,如果不是,那么一定就是基本类型,通过类型就可以啦。
2类类型[core _ tostring。call(obj)]| | ' object ' ://这是防止一些未知情况的,如果未取到,就返回目标但是jQuery.type有一个很大的缺陷
这是一个自定义类型
函数Person(){ this.name='典当';} var p=person . tostring();//注意这里会打印[object Object],用上述方法无法得到确切的自定义类型。
这也是它的一大缺陷!
接下来,我们通过构造函数得到确切的类型
通过构造函数获取类型
姜昆老师(jk)是这样教我的。谢谢您们。
在你理解这个方法之前,你需要理解两点
原型原型属性
我们知道,任何object或function都是直接或间接从Object或Function继承而来的(实际上最终的Function是从Object继承而来的,属于原型链的知识)。然后,任何一个对象都有一个原型对象__proto__(这个对象只在chrome和firefox中公开过,但在其他浏览器中也存在),这个原型对象就是这个对象的构造函数的prototype属性(这里可能有点混乱)。
由于任何函数都有一个原型属性prototype,并且这个原型属性有一个默认的属性构造函数,它是这个函数的一个引用,请参见下面的代码
函数Person(){ this.name='典当';} console . log(Person . prototype . constructor===Person);
发现这两件事其实是一回事
但是,在某些情况下,有必要这样写
函数Person(){ this.name='典当';}人。原型={xx:xx3360.}如果这样做,会覆盖原来的原型方法,构造器将不存在。这是必须显示的声明对象。
人。原型={construction:person,xx3360.xx3360.}在jQuery中,这就是它的作用。
jQuery . fn=jQuery . prototype={ constructor : jQuery,init: function(选择器,上下文,rootjQuery ) { var match,elemjQuery对象封装的方式也值得研究
Function.prototype.toString()
注意这里不熟悉[object Object],但是已经重写了。
也就是说,如果调用函数的toString()方法,将打印函数的函数体。
好了,经过以上两步,你明白我要做什么了吗?
如何通过构造函数获取变量的类型?
确定它是否是基本类型
var GetType=function(obj){ if(obj==null){ return String(obj);} if(类型为obj==' object' | |类型为obj==' function '){ 0.} else {//如果不是引用类型,是obj的基本类型return typeof如果是对象或函数类型,
函数Person(){ this.name='典当';} var p=new Peer();console . log(p . constructor);
现在怎么办,怎么提取Person?
毫无疑问,切弦肯定可以做到,但是太低了!
在这里,我用规律性来提取人
var regex=/function\s(。)\(/function Person(){ this.name='典当';} var p=new Peer();var c=p . constructor var regex=/function \ s(。)\(/;console . log(' | ' regex . exec(c)[1]' | ');
加载模块
其实除了上面的规律性,每个函数还有一个name属性,返回函数名,但是ie8不支持。
因此,上面的代码可以写成:
var GetType=function(obj){ if(obj==null){ return String(obj);} if(type of obj==' object ' | | type of obj==' function '){ var constructor=obj . constructor;if(constructor constructor . name){ return constructor . name;} var regex=/function\s(。)\(/;返回regex . exec(c)[1];}else{ //如果不是引用类型,则为basic类型返回obj的类型;}};但是上面的代码太难看了,简化一下吧
简化
var GetType=function(obj){ if(obj==null){ return String(obj);} if(type of obj==' object ' | | type of obj==' function '){ return obj . constructor obj . constructor . name . tolowercase()| |/function \ s(。)\(/.exec(obj.constructor)[1]。toLowerCase();}else{ //如果不是引用类型,就是obj的基本类型return typeof}};还是麻烦,继续简化
var GetType=function(obj){ if(obj==null){ return String(obj);}返回类型obj===' object ' | |类型obj==='函数'?物体。构造函数对象。构造函数。名称对象。构造函数。名字。tolowercase()| |/function \ s(.)\(/.exec(obj.constructor)[1].toLowerCase():类型的obj };好了,已经全部弄完了,写个代码测试一下:
函数Person(){ this.name='典当;} var p=new Peer();控制台。日志(GetType(p));控制台。日志(GetType(1));控制台。日志(GetType(' a '));控制台。日志(GetType(false));控制台。日志(GetType(/123/);控制台。日志(GetType({ });控制台。log(GetType(function(){ });控制台。日志(GetType(new Date()));console.log(getType(新的error()));控制台。日志(GetType(null));console.log(getType(未定义));
总结
好了,以上就是关于如何获取变量的类型名的全部介绍了,希望本文的内容能对你提供帮助。如果有疑问大家可以留言交流。
版权声明:JavaScript用构造函数如何获取变量的类型名是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。