jQuery(1.9.0)的each方法原文如下:
// args is for internal usage only
each: function( obj, callback, args ) {
var value,
i = 0,
length = obj.length,
isArray = isArraylike( obj );
if ( args ) {
if ( isArray ) {
for ( ; i < length; i++ ) {
value = callback.apply( obj[ i ], args );
if ( value === false ) {
break;
}
}
} else {
for ( i in obj ) {
value = callback.apply( obj[ i ], args );
if ( value === false ) {
break;
}
}
}
// A special, fast, case for the most common use of each
} else {
if ( isArray ) {
for ( ; i < length; i++ ) {
value = callback.call( obj[ i ], i, obj[ i ] );
if ( value === false ) {
break;
}
}
} else {
for ( i in obj ) {
value = callback.call( obj[ i ], i, obj[ i ] );
if ( value === false ) {
break;
}
}
}
}
return obj;
}
其中按照有无参数,分为两种情况遍历,每种情况里面又分为数组和普通对象遍历,一般而言,for in就可以搞定数组和对象,但是特殊情况就会出问题。比如,Array原型上
扩展了别的方法,这时再用for in遍历就连原型的扩展方法就包含进来了。如下代码
Array.prototype.test = function(){};
var res = ["a",1];
for(var i=0;i<res.length;i++){
console.log(res[i]);//"a",1
}
console.log("*******************");
for(var key in res){
console.log(res[key]);//"a",1,function Array.prototype.test()
}
由此可见,jQuery设计上还是非常严谨的。