maz*_*lix 4 javascript performance jquery google-chrome
除非我的测试出现问题,否则当我在Chrome上运行这个jsfiddle时,$("#id")选择器大约需要11ms,选择器需要56ms $(div#id).
$(document).ready(function(){
startTime = new Date().getTime();
for (i = 0; i < 10000; i++)
{
s = $("#idC12");
}
$("#idResults").html("c12 by id only time: "+elapsedMilliseconds(startTime));
startTime = new Date().getTime();
for (i = 0; i < 10000; i++)
{
s = $("div#idC12");
}
$("#classResults").html("c12 by tagname#id: "+elapsedMilliseconds(startTime));
});
function elapsedMilliseconds(startTime)
{
var n = new Date();
var s = n.getTime();
var diff = s - startTime;
return diff;
}
Run Code Online (Sandbox Code Playgroud)
Den*_*ret 11
这是因为$("#id")内部使用本机document.getElementById函数,该函数使用从id链接到具有此id的(唯一)元素的映射.
这是jQuery源代码中的相关代码:
// Easily-parseable/retrievable ID or TAG or CLASS selectors
rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/
...
// Speed-up: Sizzle("#ID")
if ( (m = match[1]) ) {
if ( nodeType === 9 ) {
elem = context.getElementById( m );
// Check parentNode to catch when Blackberry 4.6 returns
// nodes that are no longer in the document #6963
if ( elem && elem.parentNode ) {
// Handle the case where IE, Opera, and Webkit return items
// by name instead of ID
if ( elem.id === m ) {
results.push( elem );
return results;
}
} else {
return results;
}
} else {
// Context is not a document
if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
contains( context, elem ) && elem.id === m ) {
results.push( elem );
return results;
}
}
Run Code Online (Sandbox Code Playgroud)
你会注意到:
#someId表单时使用它请注意,在定义CSS规则或使用document.querySelector时,此规则在jQuery之外仍然适用:当您知道id时,没有什么比使用更快document.getElementById(除了缓存的元素...).