代码之家  ›  专栏  ›  技术社区  ›  Maksim Vi.

jQuery什么更快:选择器还是方法?

  •  9
  • Maksim Vi.  · 技术社区  · 14 年前

    假设我有 $('mySelector:first'); $('mySelector').first(); . 哪种方式最有效?我查了一下来源,但还是搞不清楚。

    在第一种情况下,jQuery会遍历每个项,直到得到第一个项:

    CHILD: function( elem, match ) {
            var type = match[1],
            node = elem;
            switch ( type ) {
                ...
             case "first":
              while ( (node = node.previousSibling) )  {
               if ( node.nodeType === 1 ) { 
                return false; 
               }
              }
              if ( type === "first" ) { 
               return true; 
              }
              node = elem;
                    ...
            }
    }
    

    在第二种情况下,jQuery会对集合进行切片,但我不确定它有多高效:

    function first() {
      return this.eq( 0 );
    };
    
    function eq( i ) {
      return i === -1 ?
        this.slice( i ) :
        this.slice( i, +i + 1 );
    };
    
    4 回复  |  直到 14 年前
        1
  •  13
  •   Community Neeleshkumar S    7 年前

    目前接受的答案与 tests across many browsers 比较 :first :eq(0) .first() .eq(0) .

    对于当前主要的桌面浏览器:
    $('foo').first() 几乎比 $('foo:first')

    如果你想检查方法, here are the tests and their current results .

        2
  •  2
  •   methodin    14 年前

    第二个必须在获取第一个之前获取选择器中的所有项。因此,如果选择器是10000个项目,那么它将从该组中获取所有10000个项目,然后从该组中获取第一个项目。我希望第一个在这方面会更好,因为它会在搜索时过滤(并在第一个被发现后停止)。不过,在大多数情况下可能是微不足道的。

    当然,如果您是链接函数,那么这可能是不可避免的:

    $('.someclass').addClass('otherClass').first().addClass('firstClass');
    
        3
  •  0
  •   shamittomar    14 年前

    在我的测试中, $('mySelector:first'); 更快 $('mySelector').first();

    你也可能对 this ;

        4
  •  0
  •   xandy    14 年前

    比较 $('li:first') $('li').first() ,我打赌第一个一定更快。例如,在包含100个 ,然后第二个查询将简单地构建一个包含100个项的列表,然后从中返回第一个项;另一方面,第一个查询将在返回第一个li后立即停止。

    即使查询是由浏览器本机处理的,它仍然比第一个查询占用更多的内存。