jQuery静态方法type使用和源码分析
jQuery.type方法是检测数据类型的工具方法,在分析其用法之前先总结下js给我们提供了那些监测数据类型的方法;
一、typeof 操作符
下面是测试代码
var data=[],a='123',b=0,c=true,d={1:23},e=[123],f=function(){},g=null,h=undefined,i=Math,j=/$.+^/,k= new Date();
data.push(a,b,c,d,e,f,g,h,i,j,k);
for(var key=0;key<data.length;key++){
console.log(data[key]+'的数据类型是'+typeof data[key]);
}
在上面的代码中我尽量列举了js不同的数据类型和对象,执行结果如下:
//123的数据类型是string
// 0的数据类型是number
// true的数据类型是boolean
//[object Object]的数据类型是object
//123的数据类型是object
// function (){}的数据类型是function
//undefined的数据类型是undefined
// [object Math]的数据类型是object
// /$.+^/的数据类型是object
// Wed Jul 22 2015 15:47:25 GMT+0800 (中国标准时间)的数据类型是object
我们可以看到typeof能检测到js的6大基本类型中的5个,即String,Boolean,Number,Undefined,Object 其中null被归为了Object把Function单独拿了出来,基本上还是能完成任务的,但那是对于复合类型而言就无法进一步区分了,比如到底是数组还是对象呢?这个时候就可以利用另外一个操作符instanceOf了
二、instanceOf操作符
同样的写一段测试代码
var data=[],a='123',b=0,c=true,d={1:23},e=[123],f=function(){},g=null,h=undefined,i=Math,j=/$.+^/,k= new Date();
data.push(a,b,c,d,e,f,g,h,i,j,k);
console.log(a instanceof String);
console.log(b instanceof Number);
console.log(c instanceof Boolean);
console.log(d instanceof Object);
console.log(e instanceof Array);
console.log(f instanceof Function);
console.log(j instanceof RegExp);
console.log(k instanceof Date);
在浏览器中的运行结果如下:
// false
// false
// true
// true
// true
// true
// true
可以看到只有复合类型的结果为真,而且必须保证类型是一一对应的,显然这个方法只能做个一检验方法存在,并不能在我们不知道具体数据类型的时候去做判断,可以作为typeof的一个辅助测试手段
三、constructor属性
同样的先写下测试代码
var data=[],a='123',b=0,c=true,d={1:23},e=[123],f=function(){},g=null,h=undefined,i=Math,j=/$.+^/,k= new Date();
data.push(a,b,c,d,e,f,g,h,i,j,k);
for(var key=0;key<data.length;key++){
try{
console.log(data[key]+'的检测结果是' +data[key].constructor);
}catch(e){
}
}
运行结果如下:
//123的检测结果是function String() { [native code] }
//0的检测结果是function Number() { [native code] }
//true的检测结果是function Boolean() { [native code] }
//[object Object]的检测结果是function Object() { [native code] }
//123的检测结果是function Array() { [native code] }
//function (){}的检测结果是function Function() { [native code] }
//[object Math]的检测结果是function Object() { [native code] }
///$.+^/的检测结果是function RegExp() { [native code] }
//Wed Jul 22 2015 16:23:41 GMT+0800 (中国标准时间)的检测结果是function Date() { [native code] }
其中null调用是会报错所以加了try语句,相对而言此方法能够很方便的获取其构造函数,这样就能判断了,遗憾的是该属性并非是只读属性是可以被修改的,一旦被修改或者涉及到对象继承等问题时会导致不准而且在遇到某些值得时候会报错导致程序无法运行比如null,还有没有其他方法呢?
四、Object.prototype.toString方法
该方法通过调用待测试数据的toString方法来获得其构造函数的字符串表示,测试代码如下:
var data=[],a='123',b=0,c=true,d={1:23},e=[123],f=function(){},g=null,h=undefined,i=Math,j=/$.+^/,k= new Date();
data.push(a,b,c,d,e,f,g,h,i,j,k);
for(var key=0;key<data.length;key++){
console.log(data[key]+'的检测结果是' +Object.prototype.toString.call(data[key]));
}
运行结果如下:
//123的检测结果是[object String]
//0的检测结果是[object Number]
//true的检测结果是[object Boolean]
//[object Object]的检测结果是[object Object]
//123的检测结果是[object Array]
//function (){}的检测结果是[object Function]
//null的检测结果是[object Null]
//undefined的检测结果是[object Undefined]
//[object Math]的检测结果是[object Math]
///$.+^/的检测结果是[object RegExp]
//Wed Jul 22 2015 16:33:05 GMT+0800 (中国标准时间)的检/测结果是[object Date]
看到结果是不是感觉很爽!不仅可以检测到所有数据类型,而且把Object子类型也现实了出来,也不用担心报错,之所以能实现是因为所有的对象都是基于Object而来的,其实jQery也是采取的这个方法,只不过是做了进一步处理让我们看着更爽而已!
看看使用jQuery.type的结果
var data=[],a='123',b=0,c=true,d={1:23},e=[123],f=function(){},g=null,h=undefined,i=Math,j=/$.+^/,k= new Date();
data.push(a,b,c,d,e,f,g,h,i,j,k);
for(var key=0;key<data.length;key++){
console.log(data[key]+'的检测结果是' +$.type(data[key]));
}
运行结果:
//123的检测结果是string
//0的检测结果是number
//的检测结果是boolean
//[object Object]的检测结果是object
//123的检测结果是array
//function (){}的检测结果是function
//null的检测结果是null
//undefined的检测结果是undefined
//[object Math]的检测结果是object
///$.+^/的检测结果是regexp
//Wed Jul 22 2015 16:44:25 GMT+0800 (中国标准时间)的检测结果是date
ok,结果无可挑剔了,下面附上源码:
type: function( obj ) {
return obj == null ?
String( obj ) :
class2type[ toString.call(obj) ] || "object";
},
如果是undefined或者是null他们的数据累类型就是自己,直接返回字符串形式,如果是其他数据就执行toString方法,该方法在之前有介绍
toString = Object.prototype.toString,
返回的结果就像之前测试过的结果类似 [object Date]这样的 如果不能取到就返回object,结果作class2type的键,下面来看下class2type的定义:
// Populate the class2type map
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
});
好了type方法分析完毕。
jQuery静态方法type使用和源码分析的更多相关文章
- jQuery静态方法globalEval使用和源码分析
Eval函数大家都很熟悉,但是globalEval方法却很少使用,大多数参考手册也没有相关api,下面就对其用法和源码相应介绍: jQuery.globalEval()函数用于全局性地执行一段Java ...
- jQuery静态方法parseXML使用和源码分析
jQuery.parseXML( data ) 接受一个格式良好的 XML 字符串,返回解析后的 XML 文档. 方法 jQuery.parseXML() 使用浏览器原生的 XML 解析函数实现. 在 ...
- jQuery静态方法isPlainObject,isEmptyObject方法使用和源码分析
isPlainObject方法 测试对象是否是纯粹的对象(通过 "{}" 或者 "new Object" 创建的) 示例: //测试是否为纯粹的对象 jQuer ...
- jQuery 2.0.3 源码分析Sizzle引擎解析原理
jQuery 2.0.3 源码分析Sizzle引擎 - 解析原理 声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 先来回答博友的提问: 如何解析 div > p + ...
- Quartz学习--二 Hello Quartz! 和源码分析
Quartz学习--二 Hello Quartz! 和源码分析 三. Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...
- Kubernetes Job Controller 原理和源码分析(一)
概述什么是 JobJob 入门示例Job 的 specPod Template并发问题其他属性 概述 Job 是主要的 Kubernetes 原生 Workload 资源之一,是在 Kubernete ...
- Kubernetes Job Controller 原理和源码分析(三)
概述Job controller 的启动processNextWorkItem()核心调谐逻辑入口 - syncJob()Pod 数量管理 - manageJob()小结 概述 源码版本:kubern ...
- 分享7款非常实用的jQuery/CSS3插件演示和源码
上次我们分享了15款效果很酷的最新jQuery/CSS3特效,非常不错,今天要分享7个非常实用的jQuery/CSS3插件演示和源码,一起来看看. 1.jQuery ajax点击地图显示商家网点分布 ...
- Android Debuggerd 简要介绍和源码分析(转载)
转载: http://dylangao.com/2014/05/16/android-debuggerd-%E7%AE%80%E8%A6%81%E4%BB%8B%E7%BB%8D%E5%92%8C%E ...
随机推荐
- Oracle如何实现从特定组合中随机读取值
在这里,我们会用到DBMS_RANDOM包和CASE WHEN语句,思路如下: 一.利用DBMS_RANDOM.RANDOM函数随机生成数值,然后对数值进行取模,如果我们要在10个元素中随机读取的话, ...
- 苹果官方发布,iPhone 6 & Plus 设计素材
苹果发布 iPhone 6 和 iPhone 6 Plus 有一段时间了,据说首日预定量达到了创纪录的1600万部,真是不可思议.苹果已经创建了一些指引,让开发者可以受益.他们已经发布了一组苹果官方的 ...
- Android 软件开发之如何使用Eclipse Debug调试程序详解及Eclipse常用快捷键(转)
1.在程序中添加一个断点如果所示:在Eclipse中添加了一个程序断点 在Eclipse中一共有三种添加断点的方法 第一种: 在红框区域右键出现菜单后点击第一项 Toggle Breakpoint 将 ...
- 11款扁平化设计的 Twitter Bootstrap 主题和模板
扁平化设计和 Bootstrap 框架是2013年网页设计领域的两大设计潮流.把这两者集合起来不是件容易的事情,使用下面这些主题和模板将节省我们的开发时间,因为我们可以修改已有的基础代码,而不是从零开 ...
- 在Elasticsearch中查询Term Vectors词条向量信息
这篇文章有点深度,可能需要一些Lucene或者全文检索的背景.由于我也很久没有看过Lucene了,有些地方理解的不对还请多多指正. 更多内容还请参考整理的ELK教程 关于Term Vectors 额, ...
- 基于HTML5的3D网络拓扑自动布局
上篇将HT for Web的3D拓扑弹力布局的算法运行在Web Workers后台(http://www.hightopo.com/blog/70.html),这篇我们将进一步折腾,将算法运行到真正的 ...
- 实现iOS图片等资源文件的热更新化(二):自定义的动态 imageNamed
这篇文章,要解决的是,使用一个自定义的 imageNamed 函数来替代系统的 imageNamed 函数.内部逻辑,将贯穿对比论证 关于"合适"的图片的定义.对iOS加载图片的规 ...
- ADO.NET基础02
查询和操作数据库 要想从数据库中读取多条记录就必须用到Command对象的ExecuteReader()方法,该方法返回一个DataReader对象,通过其对象的程序就可以访问数据库. 基础知识 ...
- StgCreateDocfileOnILockBytes复合文档
CRichEditCtrl 的ole技术 ------------ IRichEditOle --------------------------- 如需向CRichEditCtrl里面插入Ole对象 ...
- HoverTree项目添加了查看留言列表功能
HoverTree项目添加了查看留言列表功能 页面:HoverTreeWeb项目下hvtpanel/usermessage/messagelist.aspx 添加留言页面:addmessage.asx ...