jquerying现有的jQuery对象有成本吗?

时间:2015-06-10 18:04:03

标签: javascript jquery performance optimization benchmarking

我想知道在没有先检查something是否已经是jQuery实例的情况下懒惰地执行function foo( element ){ var $element = $( element ); // do something with $element... } 是否有任何性能下降?

我正在考虑的用例是如下函数:

foo( $( "#somediv" ) );

如果您将jQuery实例传递给该函数,您是否正在使用另一个jQuery实例重新包装jQuery实例?这是否有任何性能影响(例如,经过多次迭代)?

jQuery.fn.init

查看源代码(本问题的v 2.1.4),我们看到jQuery.makeArray检查传递给它的选择器,如果它不是字符串,DOM元素或函数,那么我们只需将其传递给makeArray并返回结果。

因此,如果选择器已经是jQuery实例,那么jQuery“构造函数”中似乎没有任何明确的检查。但这真的很重要吗?

merge使用push和/或StaleDataError,因此会有一些额外的处理,但它有意义吗?

1 个答案:

答案 0 :(得分:2)

好吧,因为我似乎永远无法离开需要剃须的牦牛,这里是JSPerf test,这似乎暗示检查和短路而不是(意外)重新包装jQuery实例可以将性能提高多达30%。在我的书中,它足以保证丑陋的代码。

以下是两项测试:

function noCheck(element) {
  var $element = $(element);

  $element.css("color", "red");
}

noCheck($("#somediv"));

function shortCircuit(element) {
  var $element = element instanceof jQuery ? element : $(element);

  $element.css("color", "red");
}

shortCircuit($("#somediv"));

根据JSPerf,noCheck执行速度比shortCircuit

慢30%

JSFiddle中使用此代码。

我暂时不接受我的回答以鼓励额外的观点/测试等。