There are different kinds of loops in JavaScript. There is the regular for loop, foreach loop, for...of, and for...in. In this blog post we will take a look at the for...of and for...in loops.

for…of

The for...of loop iterates over objects that are iterable such as arrays, strings and maps.

Structure

for (element of iterableObject) {

    ...
}

Examples

Arrays
const numbers = [1, 2, 3];

for (const element of numbers) {

    console.log(element); //1, 2, 3

}
Maps
const family = new Map([['Father', 'Tom'], ['Mother', 'Anne'], ['Daugher', 'Lisa']]);

for (const element of family) {
    
    console.log(element); //['Father', 'Tom'], ['Mother', 'Anne'], ['Daugher', 'Lisa']
}

OR


for (const [key,value] of family) {
    
    console.log('Key: ' + key); //Father, Mother, Daughter
    console.log('Value: ' + value); //Tom, Anne, Lisa
}
Strings
const msg = 'hello';

for (const element of msg) {
    
    console.log(element);   //h
                            //e
                            //l
                            //l
                            //o

    
}

You can use let instead of const if you plan on doing any variable reassigning inside the loop.

for…in

The for...in loop loops over the properties of an object.

Structure

for (props in object) {

    ...
}

Example

const userInfo = {id: 100, firstName: 'Jeff', lastName: 'Jorgensen'};

for (const props in userInfo) {

    console.log(props); //id
                        //firstName
                        //lastName

    console.log(userInfo[props]); //100
                                  //Jeff
                                  //Jorgensen

    console.log(`${props}: ${userInfo[props]}`); //id: 100
                                                 //firstName: Jeff
                                                 //lastName: Jorgensen
}

NOTE: Be careful when using a for...in loop since it does not loop over object properties in order. It should also not be used to loop over arrays where the order of the array index is important.

Modifying properties during iteration should be avoided, except if it is the property that the iterator is currently on. The reason for this, is that one cannot ensure that the iterator will reach a property that will be deleted, for example, before it has been deleted. There is no assurance either, that the iterator will be able to get to a property that has been added to the object or even display the previous or new value for a modified property.