jQuery源码阅读4-1:类型判断 type()方法

js里类型判断是个比较麻烦的事儿,
原生的api不够准确 , 比如typeof 来判断数据类型,只能区分基本类型”number”,”string”,”undefined”,”boolean”,”object”实测再加上”function”, 太过笼统
所以jQuery自己弄了个type()方法来返回具体类型 , 源码里调用了n多次 应该算是个比较重要的工具函数了

类型判断是个比较大的话题,一回说不清楚, 慢慢拆 慢慢看

还是先看用法:

一:用法示例

1
2
3
4
5
6
7
8
9
10
11
//1: 以下情况 ,typeof都会返回"object", jQuery.type的判断更准确
jQuery.type(null);//"null"
jQuery.type([]);//"array"
jQuery.type(new Date());//"date"
jQuery.type(/ruantao.duapp.com/);//"regexp"
//2: 做过兼容的自定义对象判断
var cosObj = {
blog:"ruantao.duapp.com/blog"
}
jQuery.type(cosObj)//"object"

二:type()方法阅读

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
* 博文作者:ruantao1989@gmail.com
* 引自博客:ruantao.duapp.com/blog
*/
//==>源码33行
//缓存了一堆原生方法的引用
core_toString = Object.prototype.toString,
// [[Class]] -> type pairs
class2type = {};
//==>源码900行,
//用each方法扩展 , 最后class2type存的都是键值对 比如[object Date]: "date",
//这里并不包括null和undefined, 因为查询这个对象之前, 会处理null和undefined
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
});
//==>源码433行
type: function( obj ) {
return obj == null ?
//1.只有null和undefined的情况下, 用一下String强转(强转的话题也太大,用toString什么的, 这只用到这种情况)
//String( undefined )==>"undefined" , String( null )==>"null"
String( obj ) :
//2.其余交给class2type, 如果class2type没查到, 那就是自定义的object
//(我觉得chrome中 最后的|| "object"根本没可能执行 , 可能和兼容性有关, 有可能某些浏览器Object.prototype.toString.call不能正确的查到值)
class2type[ core_toString.call(obj) ] || "object";
//补充一点Object.prototype.toString其实能准确判断null和undefined, 现在的逻辑 第一个分支过滤掉,这里就能用于|| "object"判断了, 相当巧妙
},
//==>源码417行
// See test/unit/core.js for details concerning isFunction.
// Since version 1.3, DOM methods and functions like alert
// aren't supported. They return false on IE (#2968).
isFunction: function( obj ) {
return jQuery.type(obj) === "function";
},
//优先用原生Array.isArray判断, 如果没有(ie8就没有), 在调用jQuery.type
isArray: Array.isArray || function( obj ) {
return jQuery.type(obj) === "array";
},
//这种都不用调type方法
isWindow: function( obj ) {
return obj != null && obj == obj.window;
},

类型判断里还有几个函数没仔细看, 明天继续