Why falsiness is a bad idea

It doesn't require much thought to convince yourself that "falsy" and "truthy" checking is prone to bugs.

It's a pretty common pattern among JavaScript developers, and can introduce the most insidious (pretty awesome reference since the demon is called the "lipstick demon") bugs.

What is it?

Truty/falsy checking is when a value is interpreted as true or false. The most obvious example is 0 == false // true if you care to open a browser terminal and type that in.

What is the problem?

So another funky thing is this: !null // true or !undefined // true or So when JavaScript developers want to check if thier variable is populated with a value they do stuff like this

function(x) {
  if (x) {
    // We have a value
    doSomething();
  }
}

If we get an empty string or a zero here we are doomed.

What we really want to check is if the value is either undefined or null But that too is really annoying becase it's a lot of code for very basic stuff.

function(x) {
  if (x !== undefined || x !== null) {
    // We have a value (including '' and 0)
    doSomething();
  }
}

Or another one I've tried ![null, undefined].includes(x) This is a pretty nice function we can call const isDefined = (x) => ![null, undefined].includes(x) and use it in our code. It makes a lot of sense

function(x) {
  if (isDefined(x)) {
    // We have a value (including '' and 0)
    doSomething();
  }
}

Areas of application

const xs = [0, 1, null, 13, undefined, 0, 12];
xs.filter(isDefined); // keeps all numbers