jQuery 现有的 jQuery 对象是否有成本?
Is there a cost to jQuerying an existing jQuery object?
我想知道在不首先检查 something
是否已经是 jQuery 实例的情况下懒惰地执行 $( something )
是否有任何性能缺点?
我想到的用例是如下函数:
function foo( element ){
var $element = $( element );
// do something with $element...
}
如果您将一个 jQuery 实例传递给该函数,您是否正在用另一个 jQuery 实例重新包装一个 jQuery 实例?这对性能有影响吗(比如,经过多次迭代)?
foo( $( "#somediv" ) );
查看源代码(这个问题的 v 2.1.4),我们看到 jQuery.fn.init
检查传递给它的选择器,如果它不是字符串,则 DOM 元素或者一个函数,那么我们只需将它传递给 jQuery.makeArray
和 return 结果。
因此,如果选择器已经是 jQuery 实例,jQuery "constructor" 中似乎没有任何显式检查会短路。但这真的重要吗?
makeArray
使用merge
and/orpush
,所以有一些额外的处理,但它重要吗?
好吧,因为我似乎永远无法离开需要剃毛的 Yak,这里是 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 中尝试使用此代码。
我暂时不会接受我的回答以鼓励其他观点/测试等
我想知道在不首先检查 something
是否已经是 jQuery 实例的情况下懒惰地执行 $( something )
是否有任何性能缺点?
我想到的用例是如下函数:
function foo( element ){
var $element = $( element );
// do something with $element...
}
如果您将一个 jQuery 实例传递给该函数,您是否正在用另一个 jQuery 实例重新包装一个 jQuery 实例?这对性能有影响吗(比如,经过多次迭代)?
foo( $( "#somediv" ) );
查看源代码(这个问题的 v 2.1.4),我们看到 jQuery.fn.init
检查传递给它的选择器,如果它不是字符串,则 DOM 元素或者一个函数,那么我们只需将它传递给 jQuery.makeArray
和 return 结果。
因此,如果选择器已经是 jQuery 实例,jQuery "constructor" 中似乎没有任何显式检查会短路。但这真的重要吗?
makeArray
使用merge
and/orpush
,所以有一些额外的处理,但它重要吗?
好吧,因为我似乎永远无法离开需要剃毛的 Yak,这里是 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
在 JSFiddle 中尝试使用此代码。
我暂时不会接受我的回答以鼓励其他观点/测试等