在JQuery中查找节点的成本是多少?

时间:2013-01-22 17:06:12

标签: javascript jquery

我总是保存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 个答案:

答案 0 :(得分:8)

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

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

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

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

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

答案 1 :(得分: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对象中。

答案 2 :(得分:0)

如果你多次操纵相同的东西 - 最好做一个变量。

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

我删除了关于缩短代码的声明 - 这里是关于jQuery选择器的net-tuts article和“从右到左”的思考

答案 3 :(得分:0)

众所周知,jQuery的选择成本很高,然后运行.find更是如此。缓存对象绝对是一个好主意,从干燥的角度来看也具有风格上的优势。