伪选择器与方法

时间:2011-08-22 08:36:45

标签: jquery

只是感兴趣,哪一个更快?无法谷歌了。

例如,$('li:first') vs $('li').first()

3 个答案:

答案 0 :(得分:3)

更新:显然解析表达式会产生大量开销。 我的quick benchmark .first()比使用选择器快得多。

表达式简单地归结为$ .expr对象like explained here

上的方法

实际执行:first vs .first()有点不同:

以下代码:首先在$.expr.setFilters.first

function ( elem, i ) {
  return i === 0;
}

虽然$.fn.first只是.eq(0)的缩写:

function () {
  return this.eq( 0 );
}

没有查看实际的代码我会实现第一个(),如果它不存在那样:

$.extend($.expr[':'],{
    first: function(a) {
        return $(a).first();
    }
});

这也意味着:首先只是元素列表上的过滤器,而.first()是一个效率更高的reduce操作。

Update2 :Doh - 应该有read the docs。由于jQuery尝试在现代浏览器中使用本机CSS选择器,并且:first没有来自CSS规范的选择器,它总是比可以利用浏览器本机CSS搜索方法的真实选择器更糟糕(而jQuery具有在JS中模仿那种行为

答案 1 :(得分:1)

$('li').first()比使用$('li:first')快十倍。 使用Firefox 3.6进行测试。

100,000 iterations:
55,870ms using :first
5,858ms using .first()

使用此代码:

$(document).ready (function() {
var i, time = +new Date;
for ( i = 0; i < 100000; ++i ) {
$('li:first');
}
console.log ( (+new Date) - time );
time = +new Date;
for ( i = 0; i < 100000; ++i ) {
$ $('li').first();
}
console.log ( (+new Date) - time );
});

答案 2 :(得分:0)

我不完全确定,但我的猜测是内部它会起作用,所以性能差别不大。但我可能完全错了。