Ashley’s Blog

A blogging framework for Ashley.

JQuery Merge

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 对象。