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

Posted

技术标签:

【中文标题】jQuery 啥更快:选择器还是方法?【英文标题】:jQuery what is faster: selectors or methods?jQuery 什么更快:选择器还是方法? 【发布时间】:2011-05-14 20:35:41 【问题描述】:

假设我有$('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 );
;

【问题讨论】:

速度上的差异是如此之小,以至于丝毫没有关系。 @Phrogz 这真是让人着迷。 @Raynos 谢谢 (?) :) @Alex 速度的差异似乎是 4 倍,所以它可以加起来更大的选择。 【参考方案1】:

当前接受的答案与tests across many browsers 不一致,将:first:eq(0).first().eq(0) 进行比较。

对于当前主要的桌面浏览器:$('foo').first() 的速度几乎是$('foo:first') 的四倍

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

【讨论】:

好点,我会给你答案,除非 shamittomar 可以提供他的测试。 欢迎数据驱动的答案! +1。【参考方案2】:

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

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

$('.someclass').addClass('otherClass').first().addClass('firstClass');

【讨论】:

【参考方案3】:

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

您可能也对this感兴趣;

【讨论】:

很好的链接,谢谢。现在我要优化我的选择器 =) 你介意分享测试吗? 您是否在不同的浏览器、版本和操作系统上进行了测试?您是否测试了具有单个匹配元素与 10 和 100 的文档?【参考方案4】:

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

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

【讨论】:

另外,CSS 选择器最终将全部由浏览器实现,这将使其更快。 您的逻辑假设是有效的,但是您是否检查了 Sizzle 源以确保在查找过程中而不是在查找完整集之后应用了 :first 伪类?

以上是关于jQuery 啥更快:选择器还是方法?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 选择器优化

jQuery 选择器:获取子集的哪个更快?

我可以使用啥 jQuery 选择器来匹配这些 HTML 元素(需要“:contains()”)?

jQuery 的空格和 > 选择器有啥区别?

jQuery 选择器返回啥样的对象? [复制]

jQuery:当 jQuery 对象找不到指定的类选择器时,jQuery 会返回啥? [复制]