( 0 || something ) in Javascript - "Logical Or" Bug

Today I remembered something that bothered me during my first days of writing javascript. A line of code that created a bug that took me a long time to detect thinking that this "buggy" line could never be the reason for the problem.

Here's a simple example to demonstrate the dilemma I had.

function incrementCounter(input, override) {
    return override || ++input || 0;
}

This method increments a certain input integer, tries to increment it or return 0 if NaN. If an override value is provided then it returns this value.

Let's take a look at some outputs with different inputs.

incrementCounter() returns 0
incrementCounter(1) returns 2
incrementCounter(1, 5) returns 5

Everything is fine and according to plan until now.

But...

incrementCounter(1, 0) returns 2

Yes 2 ! not 0. Why is that?

In javascript, zero evaluates to false when using logical or || operations. That means 0 || 'anything' will return 'anything'. For those coming from Ruby background, this makes no sense at all. In Ruby, this will return 0.

That is a mistake that some developers could fall into and take time to debug.

To make the piece of code above work correctly, we need to separate the comparison to 0 so that we return it when specified as the override.

function incrementCounter(input, override) {
    if(override == 0) { return 0; }
    return override || ++input || 0;
}

This exactly returns the expected output.

Mohamed Osama

Mohamed Osama

Software Engineer; Entrepreneur; Data analyst; Rails Contributor. linkedin.com/in/mohamedosamaa stackoverflow.com/cv/oss

Read More