merge: function( first, second ) {
var len = +second.length,
j = 0,
i = first.length;
for ( ; j < len; j++ ) {
first[ i++ ] = second[ j ];
}
first.length = i;
return first;
}
first 和 second 都是数组的话非常好理解,如果是 JQuery 对象其实也是可以的,因为 JQeury 对象本身也具有类似数组的特性
var ret = jQuery.merge( this.constructor(), elems );
所以昨天代码pushStack中解析的这一句,实际上是构造了一个全新的 JQuery 元素然后把 elems 赋给了他的 dom 属性。 再举一个 get 和 eq 区别的例子,我们都知道 get 返回的是 dom,eq 返回的是包装过后的 jquery 元素,这个其实也是通过 pushStack 来实现的
eq: function( i ) {
var len = this.length,
j = +i + ( i < 0 ? len : 0 );
//this[i] 为 dom 元素,通过 pushStack->merge包装成为了 JQuery 元素
return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
}
JQuery.slice
slice: function() {
return this.pushStack( slice.apply( this, arguments ) );
}
arguments传进去后内部调用Array.slice对 JQuery 数组做分割,将结果(一个 dom 数组)传入 pushStack 做进一步处理。最终返回分割后的 JQuery 对象。