0

I have been wonder where a for loop or a for..in loop would be farther on an array.

I have tested this using jsperf.

My For Loop had 16,676,377 op/s
while the for..in only had 519,853 op/s

So why is:

var a = ["hi", "hi2", "bye", "bye2"];

for (var i in a) {
  return a[i];
}

Slower compared to:

var a = ["hi", "hi2", "bye", "bye2"];

for (var i = 0; i < a.length; i++) {
  return a[i];
}
4

4 回答 4

3

The answer for your question is simple: for in loop was not created to deal with arrays and does additional things as well and should not be used.

The main purpose of the for-in statement is to iterate thought object's properties, not through the array. This statement will also go into the array prototype chain, iteration through inherited properties and I think you do not need this or even do not know about this.

Another funny thing that you even do not know in what order it will be iterated.

So the main thing to remember - do not use for in with arrays. Only with objects.

P.S as RobG correctly added:

A for loop will search for properties on the [[Prototype]] chain too if they aren't found on the array. E.g. a for loop over [0,,2] will search for 1 all the way to Object.prototype[[Prototype]]

于 2013-03-07T23:26:52.713 回答
1

There are a couple of things wrong here.

  1. your return in the loop's body causes the loop to abort after the first iteration, your tests are useless
  2. for..in loops over an object's properties, an array's elements are not its only properties! were you to add a property, such as a.foo = true; that would be included in iterating with for..in but not in for.

Please don't use for..in to loop arrays. Not. Ever.

于 2013-03-07T23:27:19.180 回答
0

It really depends on the JavaScript engine implementation. Because JavaScript is dynamically typed, the interpreter has to do some work to establish the type of a given variable. I suspect there are optimisations in the engine for the classic integer iterator for loop that aren't available when using for...in.

EDIT:

for..in iterates through the enumerable properties of a variable, so var i is assigned the value of each string in your array on each loop.

于 2013-03-07T23:22:41.870 回答
0

To explain why a for loop is faster than a for in loop is basically understand the underlying data structures used to store the data in memory. Looping through an indexed based array is naturally faster because of the way an array is stored in memory. It's just a location in memory and the items in the array are stored in consecutive locations, aka. in order and next to each other. Generally it's fast to retrieve elements in consecutive order because you don't have to spend time to find it, you just know the next item is always the next location beside it. And because it knows the array.length and can determine which chunks of memory has been portioned off for the array.

于 2013-03-07T23:27:24.920 回答