jQuery源码学习之七 (jQuery中扩展方法)
接下来分析扩展到 jQuery 的方法
jQuery.extend({ ... isFunction:判断传入的是否是函数, isArray:判断传入的是否是数组, isWindow:判断传入的是否是window对象, isNumeric:判断传入的是否是num, type:判断传入参数的类型, isPlainObject:, isEmptyObject:参数是否是空对象, error:抛出错误, ... })isFunction:内部调用$.type()
isFunction: function( obj ) { return jQuery.type(obj) === "function"; },isArray::新版本js自带的方法Array.isArray
isArray: Array.isArray,isWindow:window的window属性等价于 window的self 属性,它包含了对窗口自身的引用
isWindow: function( obj ) { return obj != null && obj === obj.window; }
isNumeric:利用 typeof 验证NaN返回的是仍是number,所以没有用 typeof
isNumeric: function( obj ) { return !isNaN( parseFloat(obj) ) && isFinite( obj ); },type:
1、判断null==null 或者undefined==null都会返回true。
2、typeof(null) 返回的是object;typeof(undefined)可以得到字符串 “undefined”;
3、String(obj) 首先会看obj有没有toString()方法,有的话直接调用。而没有toString方法的只有null 和undefined,则返回相应的null和undefined。
综上看出 type()方法中的if中返回的是字符串形式的 null 或者 undefined。
一般判断null会用到“===”,而判断undefined会用到typeof ;
注:某些低版本浏览器 typeof 正则的时候会返回“function”
当参数obj是number或string的时候直接返回 typeof obj;否则等于class2type[ core_toString.call(obj) ]
class2type = {}, ... core_toString = class2type.toString, ... jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); ... type: function( obj ) { if ( obj == null ) { return String( obj ); } // Support: Safari <= 5.1 (functionish RegExp) return typeof obj === "object" || typeof obj === "function" ? class2type[ core_toString.call(obj) ] || "object" : typeof obj; }
Object.prototype.toString.call(obj) 等价于 {}.toString.call(obj) 经常用来判断传入的obj的类型,这里也用到了。
class2type中的下标对应的是Object.prototype.toString.call(obj)的不同类型的返回值。
jQuery 巧妙的将类型存入到数组class2type中,最后得到的class2type:
class2type[[object Boolean]] = "boolean" class2type[[object Number]] = "number" class2type[[object String]] = "string" class2type[[object Funtion]] = "funtion" class2type[[object Array]] = "array" class2type[[object Date]] = "date" class2type[[object RegExp]] = "regexp" class2type[[object Object]] = "object" class2type[[object Error]] = "error"
isPlainObject:
if 判断排除了DOM节点 window对象以及$.type 返回的不是object的情况。
try catch 中if判断的根据是只有Objectd的prototype中才有自带的“isPrototypeOf”属性
class2type = {}, ... core_hasOwn = class2type.hasOwnProperty, ... isPlainObject: function( obj ) { if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; } try { if ( obj.constructor && !core_hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { return false; } } catch ( e ) { return false; } return true; },isEmptyObject:js自带的属性for in不到
isEmptyObject: function( obj ) { var name; for ( name in obj ) { return false; } return true; },error:调用js原生的throw new Error();
error: function( msg ) { throw new Error( msg ); },