为什么jQuery inArray太慢了?

mit*_*221 3 javascript performance jquery loops

我运行了一些测试,数据表明jQuery inArray()比简单的循环慢得多.

并且array.indexOf()甚至没有进行测试,因为我之前做过其他测试,而且表现更差.

  • 为什么它要慢得多?
  • 他们为什么不使用简单的循环?
  • 我有什么东西在监督吗?

必须有充分的理由不使用它:

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

T.J*_*der 5

如果您要测试jQuery inArray,实际测试jQuery inArray,并比较苹果和苹果(调用函数调用函数 - 您可以在性能非常关键的地方内联编写循环,但它不是您的默认移动,据推测):http://jsperf.com/inarraytest/3

准备HTML:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>
Run Code Online (Sandbox Code Playgroud)

准备代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

测试:

// 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);
Run Code Online (Sandbox Code Playgroud)

Chrome(有indexOf)的结果jQuery.inArray总是快于arrayLoop(在第一对测试用例中,我们正在搜索最后一个条目,非常明显).

IE6上的结果(没有indexOf):jQuery.inArray总是快于arrayLoop,虽然不足为奇(因为它必须完成同样的工作) - 除了奇怪的是,在我们搜索第一个条目的情况下数组,在这种情况下它更快.