Alex.Party

The JavaScript `in` Operator

I found out that the JavaScript in operator is more versatile than I thought while on stream a couple of weeks ago, so let's write a post about it so I can explain it to myself later.

for Loops

Let's start with the place you might have seen the in operator before. There are 3 ways of doing for loops in JavaScript.

Classic for Loop

In this example, we iterate over a list of things, setting the initial value of the index to 0, then incrementing it by one each time we go through the loop, until we reach the length of the array we are on. This gives us a lot of control over how we loop through things, since we control the step size. However, it's very verbose.

for ... of Loop

Here, we use the of keyword to get the value of each index available for iterating over. Less flexible, but it gets us straight to the content we probably want.

for ... in Loop

The for ... in loop is a mixture of the last 2 examples. Rather than getting the value of an index, instead we get the index. This is less flexible than the classic for loop, but it removes some of the boilerplate.

Okay, why?

In the previous examples we used the in operator with a for loop to get the index of an item in a list. But in can do more. With the in keyword, you can also check to see if an array has a value at that position.

what.

Just go with me here, this will get more useful further on.

const things = ["bananas", "apples", "spinach", "eggs", "milk"];

1 in things; // true
10 in things; // false

So we can now see if an index is defined in an array. Technically though, in isn't just for indexes. It's for properties.

'toString' in things; // true

This becomes incredibly handy if you want to see if an object has a certain property as the in keyword will also use anything the object inherits as well.

class Animal {
  constructor(){
    this.isAlive = true;
  }
}

class Cat extends Animal{
  constructor(hairLength, color){
    super();
    this.hairLength = hairLength;
    this.color = color;
  }
}

const catCat = new Cat('medium', 'gray tabby');

'isAlive' in catCat; // true

This behavior differs from Object.hasOwnProperty which doesn't look at inherited properties.

Summary

Use the in keyword to check if an object has a property. If you want more information, take a look at the MDN article.