get()方法返回dom对象,而eq()方法返回jQuery对象
$("div").get(0).innerHTML = "返回DOM对象"; var $divs = $("div"); $divs.eq(1).html("返回jQuery对象"); console.log($divs); console.log($divs[0]); //使用这种类数组方式返回的貌似都是dom元素,至于为什么,有待深究
下面代码是eq()的源码
eq: function( i ) { var len = this.length, j = +i + ( i < 0 ? len : 0 ); return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); } console.log($);
上面eq()源码用到_pushStack_方法,这是eq()方法返回jQuery对象的方法所在,下面分析它的源码
pushStack: function( elems ) { var ret = jQuery.merge( this.constructor(), elems );//this.constructor()=$()相当于返回一个空的jQuery对象,length是0,但是有很多属性方法! ret.prevObject = this;//merge方法会获取到第二个参数的length,对于DOM对象来说第二个参数是undefined,所以什么也不做,因此把它 ret.context = this.context;//放在数组中才能真正用到merge方法!如$("span").pushStack([$("#n9")[0]])这样返回的jQuery对象就不是空的了! // Return the newly-formed element set return ret;//通过这里我们可以看到pushStack返回的是通过参数构建的jQuery对象,不过该jQuery对象保存了调用者context,以及通过prevObj } //保存了调用者的引用,该引用用于end方法!
这段代码引用了博客 ,感谢大神分享