JQuery 是否仍在评估选择器 RTL

Is JQuery still evaluating selectors RTL?

本文关键字:选择器 RTL 评估 是否 JQuery      更新时间:2023-09-26

网上有太多关于JQuery选择器的信息,以至于我对JQuery选择器性能的当前状态感到困惑。

  • JQuery 还在评估选择器 RTL 吗?

不管怎样,...

  • ('#context').find('.inner') still faster than ('#context .inner')吗?
  • ('li') still faster than ('.classOnAllAndOnlyOnLiElements')吗?

我知道我可以编写自己的 JSPerf 性能评估,但是,我担心我会使用的那种 DOM 树不适合这样的测试(因为我不是专业人士,因此不知道我需要生成什么东西,例如 # DOM 树级别,# DOM 树元素等(

希望有人能从理论的角度回答我的问题,并通过更多地了解JQuery实现,而不是通过简单的性能评估,这可能只是一个特定DOM树的答案。

jsPerf 就像任何可以回答您问题的人的答案一样具有理论性。

我们只能告诉你jQuery是如何编写的,但是没有在你的DOM上进行测试,它是没有用的 - 就像jsPerf一样......

但是,我仍然会使用 jsPerf 并在多个浏览器中对一些小型 DOM 进行抽象测试,因此您知道如何最好地编写应用程序代码,无论其大小如何 - 无论如何,这应该是任何 Web 开发的通用想法。

一般来说,编码不应该与DOM的大小联系在一起,它应该与你的产品的性能联系在一起 - 这就是像jsPerf这样的工具可以提供帮助的地方

;-(

这里重要的部分是,在简单选择器的情况下,并且你的选择器很简单,jquery使用*MatchesSelectordocument.querySelectorAll如果它可用,它显然依赖于浏览器。因此,知道的唯一方法是在您将要使用的所有浏览器中对其进行分析。

来自 jquery 源代码:

 ....
 matches = docElem.webkitMatchesSelector ||
    docElem.mozMatchesSelector ||
    docElem.oMatchesSelector ||
    docElem.msMatchesSelector,
 ....
 jQuery.extend({
find: function( selector, context, results, seed ) {
    ...
    if ( seed ) {
        while ( (elem = seed[i++]) ) {
            if ( jQuery.find.matchesSelector(elem, selector) ) {
                results.push( elem );
            }
        }
    } else {
        jQuery.merge( results, context.querySelectorAll(selector) );
    }
    return results;
}
   ....
 })
 ...
 jQuery.extend( jQuery.find, {
matches: function( expr, elements ) {
    return jQuery.find( expr, null, null, elements );
},
matchesSelector: function( elem, expr ) {
    return matches.call( elem, expr );
},
attr: function( elem, name ) {
    return elem.getAttribute( name );
}
 });