Javascript 为什么jQuery的速度太慢?

Javascript 为什么jQuery的速度太慢?,javascript,jquery,performance,loops,Javascript,Jquery,Performance,Loops,我运行了,数据显示jQuery比简单循环慢得多 而array.indexOf()甚至不在测试中,因为我以前做过其他测试,它的性能更差 为什么要慢得多 他们为什么不使用简单的循环呢 有什么是我在监督的吗 不使用此选项必须有充分的理由: for(var i=0,len=arr.length,rtn=-1;i<len;i++){ if(arr[i]==="arritem"){ rtn=i; break; } } for(var i=0,len

我运行了,数据显示jQuery比简单循环慢得多

array.indexOf()
甚至不在测试中,因为我以前做过其他测试,它的性能更差

  • 为什么要慢得多
  • 他们为什么不使用简单的循环呢
  • 有什么是我在监督的吗
不使用此选项必须有充分的理由:

for(var i=0,len=arr.length,rtn=-1;i<len;i++){
    if(arr[i]==="arritem"){
        rtn=i;
        break;
    }
}

for(var i=0,len=arr.length,rtn=-1;i您所做的只是同一个jQuery$.inArray代码的一部分,当然,当您获取代码片段并单独测试该功能时,它会更快。在它实际遍历列表以查找元素之前,请检查所有已验证的条件

这是简单循环和$.inArray()之间的额外时间

最后:如果您确实了解以下内容,您可以坚持使用简单循环

  • 输入总是一个数组
  • 发送开始索引以加快搜索速度的选项
  • 使用本机浏览器indexOf函数

  • 如果您要测试jQuery的inArray
    ,请实际测试jQuery的inArray,并进行比较(从调用函数到调用函数-您可以在性能非常关键的地方内联编写循环,但这可能不是您的默认操作):

    准备HTML:

    <script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
    <script>
    
    Chrome(具有
    indexOf
    )上的结果是
    jQuery。inArray
    总是比
    ArrayLop
    快(在第一对测试用例中,我们正在搜索最后一个条目,这非常明显)


    IE6上的结果(没有
    indexOf
    ):
    jQuery.inArray
    总是比
    arrayLoop
    快,尽管并不令人惊讶(因为它必须做基本相同的工作)-奇怪的是,在我们搜索数组中的第一个条目的情况下,搜索速度要快得多。

    从您的jsperf测试:
    返回数组.indexOf.call(array,elem,i);
    ??为什么不
    返回数组.indexOf(elem,i)
    ?为什么额外的层要通过
    调用
    ?@T.J.Crowder我以为jQuery在使用它,我从@mithril333221复制了它似乎是,如果你的目标是测试jQuery的
    inaray
    ,为什么不测试jQuery的
    inaray
    ?你可以在jsperf测试中包括库。@ajax333221:不,那不完全一样。在jQuery源代码,它引用了
    indexOf
    (一个自由符号);在OP的测试用例中,它引用了
    array.indexOf
    (array
    的一个属性)。好吧,如果我拥有jQuery,我唯一会改变的事情就是使用
    indexOf
    ,它非常慢(我看不出有什么理由在可能的情况下尝试使用它).谢谢你的时间和测试
    var arr=[0,1,2,3,4,5,6,7,8,9];
    
    function arrayLoop(elem, array, i) {
        var len = array.length;
        i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
        for ( ; i < len; i++ ) {
            // Skip accessing in sparse arrays
            if ( i in array && array[ i ] === elem ) {
                return i;
            }
        }
        return -1;
    }
    
    // jQuery.inArray last
    var rtn=jQuery.inArray(9,arr);
    
    // arrayLoop last
    var rtn = arrayLoop(9,arr);
    
    // jQuery.inArray middle
    var rtn=jQuery.inArray(4,arr);
    
    // arrayLoop middle
    var rtn = arrayLoop(4,arr);
    
    // jQuery.inArray first
    var rtn=jQuery.inArray(0,arr);
    
    // arrayLoop first
    var rtn = arrayLoop(0,arr);