接下来分析扩展到 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 );
},