jQuery什么是更快:选择器或方法?

假设我有$('mySelector:first');$('mySelector').first(); 。 哪种方式最有效? 我查看了源代码,但仍然无法弄明白。

看起来在第一种情况下,jQuery会遍历每个项目,直到获得第一个项目:

 CHILD: function( elem, match ) { var type = match[1], node = elem; switch ( type ) { ... case "first": while ( (node = node.previousSibling) ) { if ( node.nodeType === 1 ) { return false; } } if ( type === "first" ) { return true; } node = elem; ... } } 

在第二种情况下,jQuery会对集合进行切片,但我不确定它的效率如何:

 function first() { return this.eq( 0 ); }; function eq( i ) { return i === -1 ? this.slice( i ) : this.slice( i, +i + 1 ); }; 

当前接受的答案与许多浏览器的测试不一致,比较:first:eq(0).eq(0) .first().eq(0)

对于当前主流的桌面浏览器:
$('foo').first()快几倍于$('foo:first')

如果您想检查方法, 这里是测试及其当前结果 。

第二个必须在获取第一个之前获取选择器中的所有项目。 因此,如果选择器是10,000个项目,它将获取所有10,000个,然后是该组中的第一个。 我希望第一个在这方面会更好,因为它会在搜索时过滤(并在第一个被发现后停止)。 但在大多数情况下可能都是微不足道的。

当然,如果你是链接function,那么它可能是不可避免的:

 $('.someclass').addClass('otherClass').first().addClass('firstClass'); 

在我的测试中, $('mySelector:first'); $('mySelector').first();

您可能也对此感兴趣;

比较$('li:first')$('li').first() ,我敢打赌第一个必须更快。 因为,例如,在包含100 li的文档中,第二个查询将只构建一个包含100个项目的列表,然后从中返回第一个项目; 另一方面,第一个查询将在返回第一个li后停在那里。

即使查询是由浏览器本机处理的,它仍然需要比第一个更多的内存。