Every value in JavaScript is intrinsically truthy or falsey. Saying a value is truthy is like saying “hey buddy, I know you’re not actually the boolean value true, but if anyone asks I’ll just sort of pretend that you are”. Likewise for falsey.

JavaScript has exactly six falsey values: 0, NaN, '' (empty string), null, undefined, and of course the boolean value false. Everything else is truthy. This includes (possibly unexpected) values like the string 'false', -1, and empty arrays.

Be Concise

Knowing all this will let you write (and understand) more concise code. Compare the if statements below.

// assuming str is used to hold a string

if (str !== undefined && str !== null && str.length > 0) {
  console.log('str is a non-empty string');
}

if (str) {
  console.log('str is a non-empty string');
}

Here’s another example. It’s not uncommon to see terse feature detection that relies on the fact that any defined object is truthy.

if (window.File) {
  console.log('your browser supports the File API');
}

The Logical Or

JavaScript’s logical or operator (||) does not necessarily yield true or false. It actually yields the left-side value if it is truthy, otherwise it yields the right-side value. Let’s look at what is really happening when you use || in an if statement.

if (41 === 'potato' || window.File) {
  console.log('reality is melting and the number 41 is now a potato, or your browser supports the File API');
}

The left-side value is false, which is of course falsey. So the logical or operator yields the right-side value. The right-side value is truthy. The if statement sees the truthy value and succeeds.

Null Coalescing

Alright, so that was technically boring. Here’s another example with a more interesting application.

var obj = incomingObj || {};

This is JavaScript’s practical way of doing null coalescing. If the left-side incomingObj is defined, then it is truthy, and so obj is set to it. Otherwise the right-side {} is returned, causing obj to be set as a new object.

You can even chain your logical or operators.

var obj = firstChoiceObj || secondChoiceObj || thirdChoiceObj || {};

The first defined object, reading left to right, is what obj is set to.