jquery中的缓存与链式选择器?

Posted

技术标签:

【中文标题】jquery中的缓存与链式选择器?【英文标题】:Cached vs chained selectors in jquery? 【发布时间】:2012-10-07 05:56:30 【问题描述】:

我想知道使用缓存选择器和使用链式选择器之间是否存在性能差异?

如果我理解正确,则链接可以正常工作,因为每个函数都返回 jquery 对象,该对象与缓存选择器中包含的内容完全相同。因此,在下面的两个示例中,性能方面不会有差异吗?


缓存选择器
$(function()

    $.on('click', '.disabled', function()
        $toggle = $(this);
        $toggle.attr('title', 'Object Enabled');
        $toggle.toggleClass('disabled enabled');
        $toggle.html('Enabled');
    );
);


链式选择器
$(function()

    $.on('click', '.disabled', function()
        $(this)
            .attr('title', 'Object Enabled')
            .toggleClass('disabled enabled')
            .html('Enabled');
    );
);

【问题讨论】:

jsperf.com - 自己尝试一下 - 或者看看其他人的结果:***.com/questions/10433014/what-is-the-cost-of-this @ahren。 :) 谢谢这是我的问题和答案... :) @gdoron - yeeeep,我注意到你昨天在另一个问题的答案中链接到它并阅读了 - 这是一个很好的帖子 =) @ahren。谢谢,如果您想要其他资源,有一个问题被多次询问:this question 它是链接的答案。我在SO有一段时间没活跃了,所以我不能一直说它......你可以使用它。 【参考方案1】:

你可以看这里

http://jsperf.com/jquery-chaining

差异可以忽略不计。

连锁

$('#theDiv').addClass('test').removeClass('test');

59,874 Operations / Second

单独调用(缓存)

var d = $('#theDiv');
d.addClass('test');
d.removeClass('test');

62,021 Operations / Second

【讨论】:

这取决于浏览器......说一个比另一个更好更快是不正确的。我曾经做过这种测试...... 天哪,为什么:) 怎么样!是的,jsperf 确实不错:) +1 反正人! 显然,一些旧版本的 FF 和 Chrome 的链式性能稍快,但总体而言,缓存的速度稍快。我仍然不明白,jQuery 方法总是返回 jQuery 对象本身(是否有链接),我只是猜测访问内存中的另一个点将花费更多时间,而不仅仅是在返回值上链接方法。 @FabrícioMatté。这称为抽样误差。这些测试表明,两者之间绝对没有区别! @FabrícioMatté。顺便说一句,你可以检查我的(旧)jsperf here。你可以看到它FF,所有的方式都是平等的。【参考方案2】:

它会有最小的差异,它取决于执行的浏览器。

“我们应该忘记小的效率,比如大约 97% 的时间:过早的优化是万恶之源

【讨论】:

实际上同意,我只是好奇地问,不管答案如何,我都有我的编码样式:) @Hailwood。你可以check this jsperf,你可以看到差别很小,而且因浏览器而异。【参考方案3】:

它认为两者在性能上没有太大区别..

检查一下

jsperf Performance

【讨论】:

以上是关于jquery中的缓存与链式选择器?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery链式选择器方法-导航

javascript jQuery中的选择器缓存

jQuery知识点考前复习总结(详细)

jQuery 链式写法

一些jquery的坑

jQuery选择器缓存问题