5

如果我多次需要该值,我总是保存结果find()以避免多次子树遍历:

var $a_bar = $('div.foo').find('a.bar');
$a_bar.removeClass(...);
// ... code here
$a_bar.bazz();

代替

$('div.foo').find('a.bar').removeClass(...);
// ... code here
$('div.foo').find('a.bar').bazz();

我想知道这是否不是微优化......那么在其中找到节点的成本/复杂性是JQuery多少?

4

4 回答 4

8

您可以在 js perf 上对其进行测试:http: //jsperf.com/ 只需创建一个测试并运行它。

我在这里创建了一个小测试:http: //jsperf.com/jquery-find55

在我的浏览器(firefox 18)上:

  • 测试 1(我保存了查找结果)的得分为 7,074 次操作
  • 测试 2(我不保存查找结果)的得分为 1,553 次操作

所以,是的,find它是“慢”的,将它存储在一个变量中绝对是一个好主意。

于 2013-01-22T17:08:28.157 回答
1

如果您要多次重复使用变量,这对cache他们来说绝对是一个好主意,就像您正在做的那样。

.find()在你之前传递的 jQuery 对象中遍历,所以它只在已经给出的内容中查找,使其非常快。

var $mainElement = $('#whatever'),
    $innerLIs  = $mainElement.find('li'),
    $innerTDs  = $mainElement.find('td');

// Now that these are cached in memory, doing anything to them is very quick

$innerLIs.hide();
// etc etc

如果我们一直查询它们,它每次都必须查看 DOM。一旦完成,它也会每次都将其包装在一个 jQuery 对象中。

于 2013-01-22T17:09:37.100 回答
0

如果您多次操作同一事物 - 最好创建一个变量。

这样你就只是在操纵而不是每次都先查找它。

我删除了关于稍微缩短代码的声明 - 这是一篇关于 jQuery 选择器和“从右到左”思维的网络文章

于 2013-01-22T17:11:51.217 回答
0

众所周知,jQuery的选择代价高昂,然后运行.find更是如此。缓存对象绝对是一个好主意,并且从 DRY 的角度来看在风格上也是有利的。

于 2013-01-22T17:12:53.277 回答