为什么jQuery选择器这么慢?

为什么jQuery选择器这么慢?,jquery,jquery-selectors,performance,Jquery,Jquery Selectors,Performance,通过测试一个包含220个元素的页面,其中200个是复选框元素,每个元素都必须查询一个包含200个项目的数组,我惊讶地发现: 大约是其速度的4-5倍 $("input:checkbox[id$='" + code + "']").each(function() { //... 大约比a快10倍: 还尝试了通用选择器*,其性能与输入差不多 我很想知道为什么在性能上有这么大的差异 第一个示例速度更快,因为它只涉及检查所有输入元素上的id属性 input:checkbox选择器相当于一个选择器: $(

通过测试一个包含220个元素的页面,其中200个是复选框元素,每个元素都必须查询一个包含200个项目的数组,我惊讶地发现:

大约是其速度的4-5倍

$("input:checkbox[id$='" + code + "']").each(function() { //...
大约比a快10倍:

还尝试了通用选择器
*
,其性能与
输入差不多


我很想知道为什么在性能上有这么大的差异

第一个示例速度更快,因为它只涉及检查所有
输入
元素上的
id
属性

input:checkbox
选择器相当于一个选择器:

$('input[type=checkbox]')
因此,在第二个示例中,您基本上使用了两个属性选择器:

$("input[type=checkbox][id$='" + code + "']").each(function() { //...
现在在第三个示例中,由于没有指定标记名或任何其他内容,它将检查所有DOM元素,因为选择器等效于:

$("*:checkbox")//...
这就是为什么总是建议在此类选择器之前加上标记名或其他选择器

最后,您的第三个示例(最慢)相当于以下内容:

$("[type=checkbox][id$='" + code + "']").each(function() { //...

谢谢那么每个属性选择器是否分别在DOM上迭代?或者它只迭代一次,但属性的计算速度更快,因为它只需要检查id(短路?),而不是多个属性?您可以这样做$('#'+代码).each(function(){});下面是JQuery选择器性能规则的良好链接@delux,谢谢链接,注意操作符是$=所以#+代码不起作用。
$("*:checkbox")//...
$("[type=checkbox][id$='" + code + "']").each(function() { //...