性能命中多少是$($('selector'))?

问题描述:

我正在目前有像这样的应用程序:

var selector = '.selector'; 
$(selector).methodA(); 
$(selector).methodB(); 
//..... 
$(selector).methodZ(); 

为了提高性能,我要改变selector到一个jQuery对象,如:

var selector = $('.selector'); 
selector.methodA(); 
selector.methodB(); 
//..... 
selector.methodZ(); 

然而,因为这是一个非常大的应用程序,这将不得不分阶段改变,这意味着在其完全完成之前将会有如下代码:

var selector = $('.selector'); 
selector.methodA(); 
$(selector).methodB(); 
//..... 
$(selector).methodZ(); 

这最后的代码片段会比我的第一个代码片段更好的性能吗?

我的猜测是,由于对象已经是一个jQuery对象,所以任何实现都将被绕过,只是输出输入的对象,但我想确保一定。

或者最好是确保只有我的第二个代码段才能正常运行?

+3

你安装了jsperf吗? – 2013-03-20 15:22:22

+0

有一个(相当小,但完全没有必要)的性能打击,但你可以在[JS Perf](http:// jsperf)中看到这个。 – 2013-03-20 15:23:34

+0

这是选择器缓存 - 浏览器不断发展,他们如何处理这个问题,就像@Ravi建议的那样,创建一个jsperf会揭示浏览器当前如何处理缓存的一些有趣结果。 – Nic 2013-03-20 15:23:59

感谢@Ravi's comment我用jsPerf性能进行测试和继承人的结果:

enter image description herehttp://jsperf.com/nested-jquery-testing

因此第三测试确实是比第一更快。

+0

根据你的结果,我猜测底层的JQuery正在检查对象是否已经是一个JQuery对象,如果是这样,返回它(测试C),而不是每次调用都创建一个新的JQuery对象(测试A) – musefan 2013-03-21 14:52:41

+0

另外,我认为你的TEST C是错误的,应该所有3个点击行使用'$(selector)'? – musefan 2013-03-21 14:53:46

+0

@musefan这是正确的:'我的猜测是,因为对象已经是一个jQuery对象,任何实现将被绕过,只是输出输入的对象,但我想确保一定。我只是想证明,这实际上会更好的表现,而不是做出假设。 – Curt 2013-03-21 14:55:11