哪个更快,For Loop或.hasOwnProperty?

时间:2013-07-15 07:00:24

标签: javascript jquery performance for-loop

我正在开展一个项目,我需要从一个巨大的用户数据列表中提取被排除用户的列表。这让我想知道在for loop中使用带有排除ID的双array是否更快。或者,如果将id放在对象属性中并使用.hasOwnProperty()更快。

var mainList = LARGE JSON OBJECT OF DATA.
var eArray = ["123456","234567","345678","456789","012345"];
var eObject = {"123456":"0","234567":"0","345678":"0","456789":"0","012345":"0"};

使用Double For Loop方法:

for(i=0; i < mainList.length; i++){
    for(j=0; j < eArray.length; j++){
        if(mainList[i]['id'] === eArray[j]){
           //Do Something
        }
    }
}

使用.hasOwnProperty()方法:

for(i=0; i < mainList.length; i++){
    if(eObject.hasOwnProperty(mainList[i]['id'])){
       //Do Something
    }
}

我意识到还有其他方法可以使循环更快,比如在变量中存储长度。我试图简化这个。

感谢您提供任何信息。

4 个答案:

答案 0 :(得分:6)

你错过了第三种更快的选择。如果您没有以任何方式修改Object.prototype,并且ID不太可能是原型值(如valueOf等),您可以简单地使用for循环像这样:

for(var i=0; i < mainList.length; i++)
{
    if (eObject[mainList[i].id] !== undefined)
    {//or typeof eObject[mainList[i].id] !== 'undefined'
        //do something
    }
}

检查the updated JSPref,这是到目前为止的最快方式(双循环为57,252,850 ops / sec vs 17,503,538 ops / sec)

答案 1 :(得分:3)

如果你仔细想想,.hasOwnProperty()方法会更快,因为它只使用1 for loop

WRONG

我实际上有点惊讶。我期待双循环更慢。但我想你无法估计for loop的速度。

双循环

虽然这对我来说似乎是最慢的,但这实际上最终成为7,291,083 ops/sec

中最快的长椅

.hasOwnProperty()

我可以看到这会慢一些,因为函数比语句慢。这个座位在1,730,588 ops/sec

if..in

@Geuis回答包括if..in语句,并且我认为我会测试速度似乎最快,但在2,715,091 ops/sec的长度仍然没有击败for循环。

结论

For循环很快。双循环运行速度比使用.hasOwnProperty() 4倍,并且比使用if..in条件快<3> 。但是,表现并不明显;所以速度真的非常重要,你需要使事情复杂化。在我看来,if..in方法是可行的方法。

浏览器中的

Test this yourself。我正在使用Google Chrome 28

<强>更新

请务必注意,使用for..in声明可以获得最佳效果。

答案 2 :(得分:1)

修改以显示未来互联网浏览器的正确代码:访问http://jsperf.com/stackoverflow-for-vs-hasownproperty/5进行比较

var testVal = 'BigBrownFox',
    arr = [1,4,'asd','BigBrownFox',9];

if( arr.indexOf('testVal') > -1 ){
    //do something
}

用于测试另一个数组中存在的值数组:

var testVal = ['BigBrownFox'],
    arr = [1,4,'asd','BigBrownFox',9];

for(var i=0, len=testVal.length; i<len; i++){

    if( arr.indexOf(testVal[i]) > -1 ){
        //do something
    }

}

实际上,你在两种情况下的做法都略有偏差。

如果使用数组,只需使用indexOf功能。如果测试值存在,它将返回其索引。否则,如果找不到则为-1。根本不需要循环。

如果是对象,则不要使用.hasOwnProperty。是的,它可以满足您的需求,但它过于复杂且速度较慢,因为您正在进行函数调用。

只需使用

var eObject = {"123456":"0","234567":"0","345678":"0","456789":"0","012345":"0"};
if( '234567' in eObject ){ //do something }

希望这有帮助。

答案 3 :(得分:0)

在chrome中,最快的循环是

在旧版/其他浏览器中,最快的是while - 循环。

特别是如果你缓存长度。(如果mainList很大则非常重要)

因为我看到你在eObject中只有字符串我也建议使用(eObject[mainList[i].id])

(eObject[mainList[i].id] !== undefined)

var i=mainList.length;
while(i--){
  if (eObject[mainList[i].id]) {
    //do something
  }
}