The most modern and readable way to loop through an array is using the for...of loop, which iterates directly over element values without needing an index. For scenarios requiring index access or side effects, developers commonly use forEach() or the classic for loop.

Primary Methods

  • for...of loop: Introduced in ES6, this is the preferred method for iterating over iterable objects like arrays because it is clean, concise, and allows direct access to values.

    const colors = ["red", "green", "blue"];
    for (const color of colors) {
        console.log(color);
    }
  • forEach() method: This executes a provided function once for each array element and is ideal for performing side effects like logging or modifying data.

    const fruits = ["apple", "banana", "cherry"];
    fruits.forEach((item, index) => {
        console.log(`Index ${index}: ${item}`);
    });
  • Classic for loop: This offers the most precise control, allowing you to manage the loop counter and index explicitly, which is useful for specific traversal requirements.

    const numbers = [1, 2, 3, 4, 5];
    for (let i = 0; i < numbers.length; i++) {
        console.log(numbers[i]);
    }

Comparison and Best Practices

MethodAccessControlUse Case
for...ofValues onlyHigh (break/continue)Modern, readable iteration over values.
forEachValues + IndexLow (cannot break)Side effects and functional transformations.
forValues + IndexHighComplex logic, backward compatibility, or specific index manipulation.

Note: The for...in loop is not recommended for arrays as it iterates over enumerable properties (including inherited ones) rather than numeric indices, which can lead to unexpected behavior.

Three main options:

  1. for (var i = 0; i < xs.length; i++) { console.log(xs[i]); }
  2. xs.forEach((x, i) => console.log(x));
  3. for (const x of xs) { console.log(x); }

Detailed examples are below.


1. Sequential for loop:

var myStringArray = ["Hello","World"];
var arrayLength = myStringArray.length;
for (var i = 0; i < arrayLength; i++) {
    console.log(myStringArray[i]);
    //Do something
}

Pros

  • Works on every environment
  • You can use break and continue flow control statements

Cons

  • Too verbose
  • Imperative
  • Easy to have off-by-one errors (sometimes also called a fence post error)

2. Array.prototype.forEach:

The ES5 specification introduced a lot of beneficial array methods. One of them, the Array.prototype.forEach, gave us a concise way to iterate over an array:

const array = ["one", "two", "three"]
array.forEach(function (item, index) {
  console.log(item, index);
});

Being almost ten years as the time of writing that the ES5 specification was released (Dec. 2009), it has been implemented by nearly all modern engines in the desktop, server, and mobile environments, so it's safe to use them.

And with the ES6 arrow function syntax, it's even more succinct:

array.forEach(item => console.log(item));

Arrow functions are also widely implemented unless you plan to support ancient platforms (e.g., Internet Explorer 11); you are also safe to go.

Pros

  • Very short and succinct.
  • Declarative

Cons

  • Cannot use break / continue

Normally, you can replace the need to break out of imperative loops by filtering the array elements before iterating them, for example:

array.filter(item => item.condition < 10)
     .forEach(item => console.log(item))

Keep in mind if you are iterating an array to build another array from it, you should use map. I've seen this anti-pattern so many times.

Anti-pattern:

const numbers = [1,2,3,4,5], doubled = [];

numbers.forEach((n, i) => { doubled[i] = n * 2 });

Proper use case of map:

const numbers = [1,2,3,4,5];
const doubled = numbers.map(n => n * 2);

console.log(doubled);

Also, if you are trying to reduce the array to a value, for example, you want to sum an array of numbers, you should use the reduce method.

Anti-pattern:

const numbers = [1,2,3,4,5];
const sum = 0;
numbers.forEach(num => { sum += num });

Proper use of reduce:

const numbers = [1,2,3,4,5];
const sum = numbers.reduce((total, n) => total + n, 0);

console.log(sum);

3. ES6 for-of statement:

The ES6 standard introduces the concept of iterable objects and defines a new construct for traversing data, the for...of statement.

This statement works for any kind of iterable object and also for generators (any object that has a \[Symbol.iterator\] property).

Array objects are by definition built-in iterables in ES6, so you can use this statement on them:

let colors = ['red', 'green', 'blue'];
for (const color of colors){
    console.log(color);
}

Pros

  • It can iterate over a large variety of objects.
  • Can use normal flow control statements (break / continue).
  • Useful to iterate serially asynchronous values.

Cons

  • If you are targeting older browsers, the transpiled output might surprise you.

Do not use for...in

@zipcodeman suggests the use of the for...in statement, but for iterating arrays for-in should be avoided, that statement is meant to enumerate object properties.

It shouldn't be used for array-like objects because:

  • The order of iteration is not guaranteed; the array indexes may not be visited in numeric order.
  • Inherited properties are also enumerated.

The second point is that it can give you a lot of problems, for example, if you extend the Array.prototype object to include a method there, that property will also be enumerated.

For example:

Array.prototype.foo = "foo!";
var array = ['a', 'b', 'c'];

for (var i in array) {
    console.log(array[i]);
}

The above code will console log "a", "b", "c", and "foo!".

That can be particularly a problem if you use some library that relies heavily on native prototypes augmentation (such as MooTools).

The for-in statement, as I said before, is there to enumerate object properties, for example:

var obj = {
    "a": 1,
    "b": 2,
    "c": 3
};

for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) {
        // or if (Object.prototype.hasOwnProperty.call(obj,prop)) for safety...
        console.log("prop: " + prop + " value: " + obj[prop])
    }
}

In the above example, the hasOwnProperty method allows you to enumerate only own properties. That's it, only the properties that the object physically has, no inherited properties.

I would recommend you to read the following article:

  • Enumeration VS Iteration
Answer from Christian C. Salvadó on Stack Overflow
🌐
Reddit
reddit.com › r/learnprogramming › loop through big array in js - benchmark
r/learnprogramming on Reddit: Loop through big array in JS - Benchmark
January 13, 2023 -

Let's say I have a big data array filled with numbers. Like 100 000 of them.

Which is the best way to "loop through" the entire object?

I've been reading about multithreading, web workers and so on. Also if I should use .reduce instead of for-loops with bigger data.

Is those the best ways to go, theoretically?

for now I use a for loop like this:

for(let i = 0; i < array.length; i++) {

// Do stuff

}

... But I don't think it's the best solution

🌐
Sentry
sentry.io › sentry answers › javascript › loop over an array in javascript
Loop over an array in JavaScript | Sentry
January 30, 2023 - Modern JavaScript provides the for...of statement as a simple way to loop over array items.
Discussions

Loop through an array in JavaScript - Stack Overflow
There are many ways to do a loop over arrays in JavaScript. Imagine you have this array below, and you'd like to do a loop over it: ... A for loop is a common way looping through arrays in JavaScript, but it is no considered as the fastest solutions for large arrays: More on stackoverflow.com
🌐 stackoverflow.com
Loop through an array of objects and compare values. If value is not found, execute something else.
You can use .find(): const found = loc.find(({ storeNumber }) => storeNumber === sn); if (found) { //execute some code } Or a for-loop with a break: for (let i = 0; i < loc.length; i++) { if (loc[i].storeNumber === sn) { //execute some code break; } } More on reddit.com
🌐 r/learnjavascript
7
1
May 17, 2022
For loop through array and group every x number of items - JavaScript - SitePoint Forums | Web Development & Design Community
If you for loop through an array of items, what’s the best way to group the output into sections of a set number. For example, group items into a divs, with 12 items per div? Thanks, Jon More on sitepoint.com
🌐 sitepoint.com
0
September 16, 2014
How to loop through an array in JavaScript
home / developersection / forums / how to loop through an array in javascript More on mindstick.com
🌐 mindstick.com
0
March 25, 2025
🌐
Medium
medium.com › @francois.barrailla › javascript-iterate-over-array-values-and-indexes-using-a-for-of-loop-106a58972b24
JavaScript: Iterate over array values and indexes using a for-of loop | by François Barrailla | Medium
July 8, 2020 - You can easily iterate through the values AND indexes of an array thanks to the Array.prototype.entries function that will transform the array into a collection of entries. ... Each entry is an array of two values: the first one is the index of the item and the second one its value. Combined with the array destructuring assignment syntax, it provide a concise and elegant way to retrieve the item indexes inside the for-of loop.
🌐
MDN Web Docs
developer.mozilla.org › en-US › docs › Web › JavaScript › Reference › Statements › for...of
for...of - JavaScript | MDN
The for...of loop iterates and logs values that iterable, as an array (which is iterable), defines to be iterated over.
🌐
Flexiple
flexiple.com › javascript › javascript-loop-array
How to Loop Through an Array in JavaScript – JS Iterate Tutorial - Flexiple
The loop starts with i at 0, and ... fruit at index i and increments i by 1. The forEach() method in JavaScript provides a straightforward way to loop through elements in an array....
Top answer
1 of 16
5292

Three main options:

  1. for (var i = 0; i < xs.length; i++) { console.log(xs[i]); }
  2. xs.forEach((x, i) => console.log(x));
  3. for (const x of xs) { console.log(x); }

Detailed examples are below.


1. Sequential for loop:

var myStringArray = ["Hello","World"];
var arrayLength = myStringArray.length;
for (var i = 0; i < arrayLength; i++) {
    console.log(myStringArray[i]);
    //Do something
}

Pros

  • Works on every environment
  • You can use break and continue flow control statements

Cons

  • Too verbose
  • Imperative
  • Easy to have off-by-one errors (sometimes also called a fence post error)

2. Array.prototype.forEach:

The ES5 specification introduced a lot of beneficial array methods. One of them, the Array.prototype.forEach, gave us a concise way to iterate over an array:

const array = ["one", "two", "three"]
array.forEach(function (item, index) {
  console.log(item, index);
});

Being almost ten years as the time of writing that the ES5 specification was released (Dec. 2009), it has been implemented by nearly all modern engines in the desktop, server, and mobile environments, so it's safe to use them.

And with the ES6 arrow function syntax, it's even more succinct:

array.forEach(item => console.log(item));

Arrow functions are also widely implemented unless you plan to support ancient platforms (e.g., Internet Explorer 11); you are also safe to go.

Pros

  • Very short and succinct.
  • Declarative

Cons

  • Cannot use break / continue

Normally, you can replace the need to break out of imperative loops by filtering the array elements before iterating them, for example:

array.filter(item => item.condition < 10)
     .forEach(item => console.log(item))

Keep in mind if you are iterating an array to build another array from it, you should use map. I've seen this anti-pattern so many times.

Anti-pattern:

const numbers = [1,2,3,4,5], doubled = [];

numbers.forEach((n, i) => { doubled[i] = n * 2 });

Proper use case of map:

const numbers = [1,2,3,4,5];
const doubled = numbers.map(n => n * 2);

console.log(doubled);

Also, if you are trying to reduce the array to a value, for example, you want to sum an array of numbers, you should use the reduce method.

Anti-pattern:

const numbers = [1,2,3,4,5];
const sum = 0;
numbers.forEach(num => { sum += num });

Proper use of reduce:

const numbers = [1,2,3,4,5];
const sum = numbers.reduce((total, n) => total + n, 0);

console.log(sum);

3. ES6 for-of statement:

The ES6 standard introduces the concept of iterable objects and defines a new construct for traversing data, the for...of statement.

This statement works for any kind of iterable object and also for generators (any object that has a \[Symbol.iterator\] property).

Array objects are by definition built-in iterables in ES6, so you can use this statement on them:

let colors = ['red', 'green', 'blue'];
for (const color of colors){
    console.log(color);
}

Pros

  • It can iterate over a large variety of objects.
  • Can use normal flow control statements (break / continue).
  • Useful to iterate serially asynchronous values.

Cons

  • If you are targeting older browsers, the transpiled output might surprise you.

Do not use for...in

@zipcodeman suggests the use of the for...in statement, but for iterating arrays for-in should be avoided, that statement is meant to enumerate object properties.

It shouldn't be used for array-like objects because:

  • The order of iteration is not guaranteed; the array indexes may not be visited in numeric order.
  • Inherited properties are also enumerated.

The second point is that it can give you a lot of problems, for example, if you extend the Array.prototype object to include a method there, that property will also be enumerated.

For example:

Array.prototype.foo = "foo!";
var array = ['a', 'b', 'c'];

for (var i in array) {
    console.log(array[i]);
}

The above code will console log "a", "b", "c", and "foo!".

That can be particularly a problem if you use some library that relies heavily on native prototypes augmentation (such as MooTools).

The for-in statement, as I said before, is there to enumerate object properties, for example:

var obj = {
    "a": 1,
    "b": 2,
    "c": 3
};

for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) {
        // or if (Object.prototype.hasOwnProperty.call(obj,prop)) for safety...
        console.log("prop: " + prop + " value: " + obj[prop])
    }
}

In the above example, the hasOwnProperty method allows you to enumerate only own properties. That's it, only the properties that the object physically has, no inherited properties.

I would recommend you to read the following article:

  • Enumeration VS Iteration
2 of 16
1210

Yes, assuming your implementation includes the for...of feature introduced in ECMAScript 2015 (the "Harmony" release)... which is a pretty safe assumption these days.

It works like this:

// REQUIRES ECMASCRIPT 2015+
var s, myStringArray = ["Hello", "World"];
for (s of myStringArray) {
  // ... do something with s ...
}

Or better yet, since ECMAScript 2015 also provides block-scoped variables:

// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
  // ... do something with s ...
}
// s is no longer defined here

(The variable s is different on each iteration, but can still be declared const inside the loop body as long as it isn't modified there.)

A note on sparse arrays: an array in JavaScript may not actually store as many items as reported by its length; that number is simply one greater than the highest index at which a value is stored. If the array holds fewer elements than indicated by its length, its said to be sparse. For example, it's perfectly legitimate to have an array with items only at indexes 3, 12, and 247; the length of such an array is 248, though it is only actually storing 3 values. If you try to access an item at any other index, the array will appear to have the undefined value there, but the array is nonetheless is distinct from one that actually has undefined values stored. You can see this difference in a number of ways, for example in the way the Node REPL displays arrays:

> a              // array with only one item, at index 12
[ <12 empty items>, 1 ]
> a[0]           // appears to have undefined at index 0
undefined
> a[0]=undefined // but if we put an actual undefined there
undefined
> a              // it now looks like this
[ undefined, <11 empty items>, 1 ]

So when you want to "loop through" an array, you have a question to answer: do you want to loop over the full range indicated by its length and process undefineds for any missing elements, or do you only want to process the elements actually present? There are plenty of applications for both approaches; it just depends on what you're using the array for.

If you iterate over an array with for..of, the body of the loop is executed length times, and the loop control variable is set to undefined for any items not actually present in the array. Depending on the details of your "do something with" code, that behavior may be what you want, but if not, you should use a different approach.

Of course, some developers have no choice but to use a different approach anyway, because for whatever reason they're targeting a version of JavaScript that doesn't yet support for...of.

As long as your JavaScript implementation is compliant with the previous edition of the ECMAScript specification (which rules out, for example, versions of Internet Explorer before 9), then you can use the Array#forEach iterator method instead of a loop. In that case, you pass a function to be called on each item in the array:

var myStringArray = [ "Hello", "World" ];
myStringArray.forEach( function(s) { 
     // ... do something with s ...
} );

You can of course use an arrow function if your implementation supports ES6+:

myStringArray.forEach( s => { 
     // ... do something with s ...
} );

Unlike for...of, .forEach only calls the function for elements that are actually present in the array. If passed our hypothetical array with three elements and a length of 248, it will only call the function three times, not 248 times. If this is how you want to handle sparse arrays, .forEach may be the way to go even if your interpreter supports for...of.

The final option, which works in all versions of JavaScript, is an explicit counting loop. You simply count from 0 up to one less than the length and use the counter as an index. The basic loop looks like this:

var i, s, myStringArray = [ "Hello", "World" ], len = myStringArray.length;
for (i=0; i<len; ++i) {
  s = myStringArray[i];
  // ... do something with s ...
}

One advantage of this approach is that you can choose how to handle sparse arrays. The above code will run the body of the loop the full length times, with s set to undefined for any missing elements, just like for..of; if you instead want to handle only the actually-present elements of a sparse array, like .forEach, you can add a simple in test on the index:

var i, s, myStringArray = [ "Hello", "World" ], len = myStringArray.length;
for (i=0; i<len; ++i) {
  if (i in myStringArray) {
    s = myStringArray[i];
    // ... do something with s ...
  }
}

Depending on your implementation's optimizations, assigning the length value to the local variable (as opposed to including the full myStringArray.length expression in the loop condition) can make a significant difference in performance since it skips a property lookup each time through. You may see the length caching done in the loop initialization clause, like this:

var i, len, myStringArray = [ "Hello", "World" ];
for (len = myStringArray.length, i=0; i<len; ++i) {

The explicit counting loop also means you have access to the index of each value, should you want it. The index is also passed as an extra parameter to the function you pass to forEach, so you can access it that way as well:

myStringArray.forEach( (s,i) => {
   // ... do something with s and i ...
});

for...of doesn't give you the index associated with each object, but as long as the object you're iterating over is actually an instance of Array (and not one of the other iterable types for..of works on), you can use the Array#entries method to change it to an array of [index, item] pairs, and then iterate over that:

for (const [i, s] of myStringArray.entries()) {
  // ... do something with s and i ...
}

The for...in syntax mentioned by others is for looping over an object's properties; since an Array in JavaScript is just an object with numeric property names (and an automatically-updated length property), you can theoretically loop over an Array with it. But the problem is that it doesn't restrict itself to the numeric property values (remember that even methods are actually just properties whose value is a closure), nor is it guaranteed to iterate over those in numeric order. Therefore, the for...in syntax should not be used for looping through Arrays.

Find elsewhere
🌐
Mozilla
developer.mozilla.org › en-US › docs › Web › JavaScript › Guide › Loops_and_iteration
Loops and iteration - JavaScript | MDN
This chapter of the JavaScript Guide introduces the different iteration statements available to JavaScript. You can think of a loop as a computerized version of the game where you tell someone to take X steps in one direction, then Y steps in another. For example, the idea "Go five steps to the east" could be expressed this way as a loop: ... for (let step = 0; step < 5; step++) { // Runs 5 times, with values of step 0 through 4.
🌐
Bonsaiilabs
bonsaiilabs.com › loop-array-javascript
How to loop through an array in JavaScript? - bonsaiilabs
We have this array containing the names of social channels. We declare it and add the values, Twitter, Instagram, Facebook, LinkedIn, and Snapchat. Now our goal is to loop through every element in the social array and print that element. The first approach is to use for loop in JavaScript.
🌐
CoreUI
coreui.io › blog › how-to-loop-through-an-array-in-javascript
How to loop through an array in JavaScript · CoreUI
July 23, 2024 - The for loop initializes a variable, checks a condition, and increments the variable in each iteration. It’s a straightforward way to loop through an array and access each element using array indexes.
🌐
freeCodeCamp
freecodecamp.org › news › how-to-loop-through-an-array-in-javascript-js-iterate-tutorial
How to Loop Through an Array in JavaScript – JS Iterate Tutorial
November 7, 2024 - For example, if we have an array and want to output each element in the array, rather than using the index number to do so one by one, we can simply loop through and perform this operation once.
🌐
GeeksforGeeks
geeksforgeeks.org › javascript › iterate-over-array-javascript
JavaScript - Iterate Over an Array - GeeksforGeeks
The for…of loop iterates over the values of an iterable object such as an array. It is a better choice for traversing items of iterables compared to traditional for and for in loops, especially when we have a break or continue statements.
Published   January 15, 2026
🌐
freeCodeCamp
freecodecamp.org › news › loop-through-arrays-javascript
How to Loop Through Arrays in JavaScript
October 31, 2023 - The loop starts at the first element ... it reaches the end of the array. The forEach method is a built-in JavaScript method for arrays that simplifies the process of looping through each element....
🌐
Reddit
reddit.com › r/learnjavascript › loop through an array of objects and compare values. if value is not found, execute something else.
r/learnjavascript on Reddit: Loop through an array of objects and compare values. If value is not found, execute something else.
May 17, 2022 -

This is probably an easy problem but I just can't figure it out. I'll try to explain in detail within the test script.

// an array of objects obviously...
var loc = [ 
{"id":12345, "storeNumber":"0466"},
{"id":1235, "storeNumber":"566"}
]

//our number to match the "storeNumber". 
var sn = "466";

//If sn is found, we want to execute some code
loc.forEach(function(item) {
  if(sn == item.storeNumber) {
    //execute some code
  }

//if value does not exist, like it currently doesn't...Then I need to prepend a 0 to sn variable that is 3 letters in length.
}]

Here's my problem with this...As you can see the variable sn is 466. If there is no match, and the variable is 3 characters in length. I need to prepend a zero to it. sn would then be 0466.

0466 matches storeNumber with id 12345.

How would I go about getting the ID of 0466 if the first condition if(sn == item.storeNumber) doesn't match anything in the array of objects?

The problem here is that the forEach loop will loop through hundreds of records and return true for one if it is found. But that doesn't stop the loop from running, so everything after the loop would still be false, therefore I couldn't have an else statement.

Also, I have to use ES5 syntax because i'm working with ServiceNow and it doesn't allow for ES6.

🌐
Medium
medium.com › @jacquiedesrosiers › mastering-javascript-5-ways-to-loop-through-an-array-6ed1b58f55d4
Mastering JavaScript: 5 Ways to Loop Through an Array | by jacquie d.r. | Medium
May 13, 2023 - This blog will explore some of the methods we can use to iterate through an array in JavaScript: the simple for loop, the while loop, and the methods:forEach, map, and filter.
🌐
SitePoint
sitepoint.com › javascript
For loop through array and group every x number of items - JavaScript - SitePoint Forums | Web Development & Design Community
September 16, 2014 - If you for loop through an array of items, what’s the best way to group the output into sections of a set number. For example, group items into a divs, with 12 items per div? Thanks, Jon
🌐
Built In
builtin.com › articles › javascript-loop-through-associative-arrays
JavaScript Loop Through Associative Arrays Guide | Built In
There are three common ways to loop through a JavaScript associative array object, including the for-in loop, object.entries with forEach and the for-of loop. Here’s how.
🌐
MindStick
mindstick.com › forum › 161336 › how-to-loop-through-an-array-in-javascript
How to loop through an array in JavaScript – MindStick
March 25, 2025 - The alternative approach of the forEach() method enables users to perform callback functions on array elements in a readable way without offering break capabilities. When utilized through its for...of loop the syntax simplifies the process of array value iteration and eliminates index management therefore improving code clarity.