learn kro favicon img

Logical operators

There are four logical operators in JavaScript: || (OR), && (AND), ! (NOT), ?? (Nullish Coalescing). Here we cover the first three, the ?? operator is in the next article.

Although they are called “logical”, they can be applied to values of any type, not only boolean. Their result can also be of any type.

Let’s see the details.

|| (OR)

The “OR” operator is represented with two vertical line symbols:

In classical programming, the logical OR is meant to manipulate boolean values only. If any of its arguments are true, it returns true, otherwise it returns false.

In JavaScript, the operator is a little bit trickier and more powerful. But first, let’s see what happens with boolean values.

There are four possible logical combinations:

As we can see, the result is always true except for the case when both operands are false.

If an operand is not a boolean, it’s converted to a boolean for the evaluation.

For instance, the number 1 is treated as true, the number 0 as false:

Most of the time, OR || is used in an if statement to test if any of the given conditions is true.

For example:

We can pass more conditions:

OR “||” finds the first truthy value

The logic described above is somewhat classical. Now, let’s bring in the “extra” features of JavaScript.

The extended algorithm works as follows.

Given multiple OR’ed values:

The OR || operator does the following:

  • Evaluates operands from left to right.
  • For each operand, converts it to boolean. If the result is true, stops and returns the original value of that operand.
  • If all operands have been evaluated (i.e. all were false), returns the last operand.

A value is returned in its original form, without the conversion.

In other words, a chain of OR || returns the first truthy value or the last one if no truthy value is found.

For instance:

This leads to some interesting usage compared to a “pure, classical, boolean-only OR”.

  1. Getting the first truthy value from a list of variables or expressions.For instance, we have firstNamelastName and nickName variables, all optional (i.e. can be undefined or have falsy values).Let’s use OR || to choose the one that has the data and show it (or "Anonymous" if nothing set):let firstName = ""; let lastName = ""; let nickName = "SuperCoder"; alert( firstName || lastName || nickName || "Anonymous"); // SuperCoderIf all variables were falsy, "Anonymous" would show up.
  2. Short-circuit evaluation.Another feature of OR || operator is the so-called “short-circuit” evaluation.It means that || processes its arguments until the first truthy value is reached, and then the value is returned immediately, without even touching the other argument.The importance of this feature becomes obvious if an operand isn’t just a value, but an expression with a side effect, such as a variable assignment or a function call.In the example below, only the second message is printed:true || alert("not printed"); false || alert("printed");In the first line, the OR || operator stops the evaluation immediately upon seeing true, so the alert isn’t run.Sometimes, people use this feature to execute commands only if the condition on the left part is falsy.

&& (AND)

The AND operator is represented with two ampersands &&:

In classical programming, AND returns true if both operands are truthy and false otherwise:

An example with if:

Just as with OR, any value is allowed as an operand of AND:

AND “&&” finds the first falsy value

Given multiple AND’ed values:

The AND && operator does the following:

  • Evaluates operands from left to right.
  • For each operand, converts it to a boolean. If the result is false, stops and returns the original value of that operand.
  • If all operands have been evaluated (i.e. all were truthy), returns the last operand.

In other words, AND returns the first falsy value or the last value if none were found.

The rules above are similar to OR. The difference is that AND returns the first falsy value while OR returns the first truthy one.

Examples:

We can also pass several values in a row. See how the first falsy one is returned:

When all values are truthy, the last value is returned:

Precedence of AND && is higher than OR ||

The precedence of AND && operator is higher than OR ||.

So the code a && b || c && d is essentially the same as if the && expressions were in parentheses: (a && b) || (c && d).

Don’t replace if with || or &&

Sometimes, people use the AND && operator as a “shorter way to write if“.

For instance:

The action in the right part of && would execute only if the evaluation reaches it. That is, only if (x > 0) is true.

So we basically have an analogue for:

Although, the variant with && appears shorter, if is more obvious and tends to be a little bit more readable. So we recommend using every construct for its purpose: use if if we want if and use && if we want AND.

! (NOT)

The boolean NOT operator is represented with an exclamation sign !.

The syntax is pretty simple:

The operator accepts a single argument and does the following:

  1. Converts the operand to boolean type: true/false.
  2. Returns the inverse value.

For instance:

A double NOT !! is sometimes used for converting a value to boolean type:

That is, the first NOT converts the value to boolean and returns the inverse, and the second NOT inverses it again. In the end, we have a plain value-to-boolean conversion.

There’s a little more verbose way to do the same thing – a built-in Boolean function:

The precedence of NOT ! is the highest of all logical operators, so it always executes first, before && or ||.

Tasks

What’s the result of OR?

importance: 5

What is the code below going to output?

solution

The answer is 2, that’s the first truthy value.

What’s the result of OR’ed alerts?

importance: 3

What will the code below output?

solution

The answer: first 1, then 2.

The call to alert does not return a value. Or, in other words, it returns undefined.

  1. The first OR || evaluates its left operand alert(1). That shows the first message with 1.
  2. The alert returns undefined, so OR goes on to the second operand searching for a truthy value.
  3. The second operand 2 is truthy, so the execution is halted, 2 is returned and then shown by the outer alert.

There will be no 3, because the evaluation does not reach alert(3).

What is the result of AND?

importance: 5

What is this code going to show?

solution

The answer: null, because it’s the first falsy value from the list.

What is the result of AND’ed alerts?

importance: 3

What will this code show?

solution

The answer: 1, and then undefined.

The call to alert returns undefined (it just shows a message, so there’s no meaningful return).

Because of that, && evaluates the left operand (outputs 1), and immediately stops, because undefined is a falsy value. And && looks for a falsy value and returns it, so it’s done.

The result of OR AND OR

importance: 5

What will the result be?

solution

The answer: 3.

The precedence of AND && is higher than ||, so it executes first.

The result of 2 && 3 = 3, so the expression becomes:

Now the result is the first truthy value: 3.

Check the range between

importance: 3

Write an if condition to check that age is between 14 and 90 inclusively.

“Inclusively” means that age can reach the edges 14 or 90.solution

Check the range outside

importance: 3

Write an if condition to check that age is NOT between 14 and 90 inclusively.

Create two variants: the first one using NOT !, the second one – without it.solution

The first variant:

The second variant:

A question about “if”

importance: 5

Which of these alerts are going to execute?

What will the results of the expressions be inside if(...)?

solution

The answer: the first and the third will execute.

Details:

Check the login

importance: 3

Write the code which asks for a login with prompt.

If the visitor enters "Admin", then prompt for a password, if the input is an empty line or Esc – show “Canceled”, if it’s another string – then show “I don’t know you”.

The password is checked as follows:

  • If it equals “TheMaster”, then show “Welcome!”,
  • Another string – show “Wrong password”,
  • For an empty string or cancelled input, show “Canceled”

The schema:

Please use nested if blocks. Mind the overall readability of the code.

Hint: passing an empty input to a prompt returns an empty string ''. Pressing ESC during a prompt returns null.

demo solution

Note the vertical indents inside the if blocks. They are technically not required, but make the code more readable.

Leave a Comment

Your email address will not be published. Required fields are marked *