This article was originally written for DigitalOcean.

Introduction

Loops are used in programming to automate repetitive tasks. The most basic types of loops used in JavaScript are the while and do...while statements, which you can review in "How To Construct While and Do...While Loops in JavaScript."

Because while and do...while statements are conditionally based, they execute when a given statement returns as evaluating to true. Similar in that they are also conditionally based, for statements also include extra features such as a loop counter, allowing you to set the number of iterations of the loop beforehand.

In this tutorial, we will learn about the for statement, including the for...of and for...in statements, which are essential elements of the JavaScript programming language.

For Loop

The for statement is a type of loop that will use up to three optional expressions to implement the repeated execution of a code block.

Let's take a look at an example of what that means.

for (initialization; condition; final expression) {
	// code to be executed
}

In the syntax above there are three expressions inside the for statement: the initialization, the condition, and the final expression, also known as incrementation.

Let's use a basic example to demonstrate what each of these statements does.

// Initialize a for statement with 5 iterations
for (let i = 0; i < 4; i++) {
  // Print each iteration to the console
  console.log(i)
}

When we run the code above, we'll receive the following output:

0
1
2
3

In the above example, we initialized the for loop with let i = 0, which begins the loop at 0. We set the condition to be i < 4, meaning that as long as i evaluates as less than 4, the loop will continue to run. Our final expression of i++ increments the count for each iteration through the loop. The console.log(i) prints out the numbers, starting with 0 and stopping as soon as i is evaluated as 4.

Without using a loop, we could have achieved that same output by using the following code.

// Set initial variable to 0
let i = 0

// Manually increment variable by 1 four times
console.log(i++)
console.log(i++)
console.log(i++)
console.log(i++)

Without the loop in place, the code block is repetitive and consists of more lines. If we needed to increment through more numbers we would have needed to write even more lines of code.

Let's go over each expression in the loop to understand them fully.

Initialization

Our first expression is the initialization. This is what it looks like.

let i = 0

We're declaring a variable called i with the let keyword (the keyword var may also be used) and giving it a value of 0. While the variable can be named anything, i is most frequently used. The variable i stands for iteration, is consistent, and keeps the code compact.

Condition

Just as we saw in the while and do...while loops, for loops usually contain a condition. Here is our condition statement.

i < 4

We already established that our iteration variable, i, represents 0 to start. Now we are saying that the condition is true as long as i is less than 4 in this example.

Final Expression

The final expression is a statement that is executed at the end of each loop. It is most often used to increment or decrement a value, but it can be used for any purpose.

i++

In our example, we are incrementing the variable by one, with i++. This is the same as running i = i + 1.

Unlike the initialization and condition expressions, the final expression does not end with a semicolon.

Putting it Together

Now that we've reviewed our three expressions contained in the for loop, we can take a look at the complete loop again.

// Initialize a for statement with 5 iterations
for (let i = 0; i < 4; i++) {
  console.log(i)
}

First, we are declaring i and setting it to 0. Then, we are setting a condition for the loop to run until i is less than 4. Finally, we're incrementing i by one 1 each iteration. Our code block prints the value of i to the console, so our result is 0, 1, 2, and 3 as output.

Optional Expressions

All three expressions in the for loop are optional. For example, we can write the same for statement without the initialization expression by initializing the variable outside of the loop.

// Declare variable outside the loop
let i = 0

// Initialize the loop
for (; i < 4; i++) {
  console.log(i)
}
0
1
2
3

In this case, the first ; is necessary to denote whether the statement refers to initialization, condition, or final expression, even when it's omitted.

Below, we can also remove the condition from the loop. We will use an if statement combined with break to tell the loop to stop running once i is greater than 3, which is the reverse of the true condition.

// Declare variable outside the loop
let i = 0

// Omit initialization and condition
for (; ; i++) {
  if (i > 3) {
    break
  }
  console.log(i)
}
0
1
2
3

Warning: The break statement must be included if the condition is omitted, otherwise the loop will run forever as an infinite loop and potentially crash the browser.

Lastly, the final expression can be removed by putting it at the end of the loop instead. Both semicolons must still be included, or the loop will not function.

// Declare variable outside the loop
let i = 0

// Omit all statements
for (;;) {
  if (i > 3) {
    break
  }
  console.log(i)
  i++
}
0
1
2
3

As we can see from the above examples, including all three statements generally produces the most concise and readable code. However, it's useful to know that statements can be omitted in case you encounter it in the future.

Modifying an Array

We can use for loops to modify an array.

In the next example, we'll create an empty array and populate it with the loop counter variable.

// Initialize empty array
let arrayExample = []

// Initialize loop to run 3 times
for (let i = 0; i < 3; i++) {
  // Update array with variable value
  arrayExample.push(i)
  console.log(arrayExample)
}

Running the JavaScript code above will result in the following output.

[ 0 ]
[ 0, 1 ]
[ 0, 1, 2 ]

We set a loop that runs until i < 3 is no longer true, and we're telling the console to print the arrayExample array to the console at the end of each iteration. With this method, we can see how the array updates with the new values.

Length of an Array

Sometimes, we might want a loop to run a number of times without being certain of what the number of iterations will be. Instead of declaring a static number, as we did in previous examples, we can make use of the length property of an array to have the loop run as many times as there are items in the array.

// Declare array with 3 items
let fish = ['flounder', 'salmon', 'pike']

// Initalize for loop to run for the total length of an array
for (let i = 0; i < fish.length; i++) {
  // Print each item to the console
  console.log(fish[i])
}

We'll receive the following output.

flounder
salmon
pike

In this example, we increment through each index of the array with fish[i] (e.g. the loop will increment through fish[0], fish[1], etc.). This causes the index to dynamically update with each iteration.

More detail on the for statement is available on the Mozilla Developer Network.

For...In Loop

The for...in statement iterates over the properties of an object. To demonstrate, we will make a simple shark object with a few name:value pairs.

const shark = {
  species: 'great white',
  color: 'white',
  numberOfTeeth: Infinity,
}

Using the for...in loop, we can easily access each of the property names.

// Print property names of object
for (attribute in shark) {
  console.log(attribute)
}
species
color
numberOfTeeth

We can also access the values of each property by using the property name as the index value of the object.

// Print property values of object
for (attribute in shark) {
  console.log(shark[attribute])
}
great white
white
Infinity

Putting them together, we can access all the names and values of an object.

// Print names and values of object properties
for (attribute in shark) {
  console.log(`${attribute}`.toUpperCase() + `: ${shark[attribute]}`)
}
SPECIES: great white
COLOR: white
NUMBEROFTEETH: Infinity

We used the toUpperCase() method to modify the property name, and followed it by the property value. for...in is an extremely useful way to iterate through object properties.

Review for...in on the Mozilla Developer Network for more detailed information.

For...Of Loop

The for...in statement is useful for iterating over object properties, but to iterate over iterable objects like arrays and strings, we can use the for...of statement. The for...of statement is a newer feature as of ECMAScript 6. ECMAScript (or ES) is a scripting-language specification created to standardize JavaScript.

In this example of a for...of loop, we will create an array and print each item in the array to the console.

// Initialize array of shark species
let sharks = ['great white', 'tiger', 'hammerhead']

// Print out each type of shark
for (let shark of sharks) {
  console.log(shark)
}

We'll receive the following as output from the for...of statement.

great white
tiger
hammerhead

It is also possible to print out the index associated with the index elements using the entries() method.

// Loop through both index and element
for (let [index, shark] of sharks.entries()) {
  console.log(index, shark)
}
0 'great white'
1 'tiger'
2 'hammerhead'

A string can be iterated through in the same way as an array.

// Assign string to a variable
let sharkString = 'sharks'

// Iterate through each index in the string
for (let shark of sharkString) {
  console.log(shark)
}
s
h
a
r
k
s

In this case, we looped through each character in the string, printing them in sequential order.

For a more detailed account of the differences between for...in and for...of, read about for...of loops on the Mozilla Developer Network.

Conclusion

In this tutorial, we learned how to construct for loops in JavaScript, consisting of the for, for...of and for...in statements.

Loops are an integral part of programming in JavaScript, and are used for automating repetitive tasks and making code more concise and efficient.