【发布时间】:2013-01-26 07:39:02
【问题描述】:
我不明白为什么会这样。
我读到here:
第一个 $.each 构成一个 single 函数调用来启动 迭代器。
第二个 $(foo.vals).each 调用 三个 函数来启动 迭代器。
- 第一个是 $(),它产生一个新的 jQuery 包装器 设置(不确定在此期间进行了多少其他函数调用 过程)。
- 然后调用 $().each。
- 最后它使内部 调用 jQuery.each 来启动迭代器。
在您的示例中,至少可以说差异可以忽略不计。 但是,在嵌套使用场景中,您可能会发现性能变得 一个问题。
最后,jQuery Enlightenment 中的 Cody Lindley 不推荐使用 $.each 由于函数调用,迭代次数大于 1000 涉及。使用普通的 for( var i = 0... 循环。
所以我用这个 jsperf 测试了它:
(任务:找到勾选了其中复选框的Tr,并为该tr着色。)
这是jsbin
但是看看jsperf
出乎所有人的意料,相反才是真的。 (铬和FF和IE)
使用$().each的那个(调用三个方法最快
等等。
这是怎么回事?
【问题讨论】:
-
#t tr input:checkbox:checked和#t tr :checkbox:checked是两个不同的选择器,我认为第一个更快。 -
@Stefan 你是对的。我一定错过了那个选择器。现在它按预期工作。
-
我同意较长的选择器不一定是最快的,但我不同意它会“总是更糟”。来自 jQuery API 文档:“与其他伪类选择器(以“:”开头的那些)一样,建议在其前面加上标签名称或其他选择器;否则,通用选择器(“” ) 是隐含的。换句话说,裸露的 $(':checkbox') 等价于 $(':checkbox'),所以应该使用 $('input:checkbox') 来代替。 api.jquery.com/checkbox-selector
-
我认为你需要更仔细地决定你究竟想要测试什么。如果要测试
.each()、$.each()和for之间的性能差异,则需要删除所有其他昂贵的操作,例如DOM选择/DOM遍历/元素修改。 -
$('#t tr input:checkbox:checked').closest('tr').css('background-color', 'red');!不需要each;)
标签: javascript jquery each