JavaScript If Statement: A Complete Beginner Guide

Learn how the JavaScript if statement works, including syntax, truthy and falsy values, and practical examples. Master conditional logic with real-world code patterns every beginner needs to know.

JavaScriptbeginner
10 min read

Every program needs to make decisions. Should the form submit or show an error? Should the user see the dashboard or the login page? Should the discount apply or not? In JavaScript, the if statement is the fundamental tool for answering these questions. It evaluates a condition, and if that condition is true, it runs a block of code.

Think of an if statement like a security checkpoint at an airport. The guard checks your boarding pass (the condition). If the pass is valid (true), you walk through to the gate (the code block runs). If the pass is invalid (false), you are turned away (the code block is skipped). The guard does not care about your luggage, your outfit, or your destination. It checks one thing: is the boarding pass valid?

This tutorial teaches you everything about the JavaScript if statement: the syntax, how JavaScript decides what counts as true or false, practical patterns you will use in real projects, and the mistakes that trip up beginners.

Basic If Statement Syntax

The if statement has a straightforward structure:

javascriptjavascript
if (condition) {
  // This code runs only when condition is true
}

The parentheses around the condition are required. The curly braces define the code block that runs when the condition evaluates to true:

javascriptjavascript
const temperature = 35;
 
if (temperature > 30) {
  console.log("It is hot outside. Stay hydrated.");
}
// Output: "It is hot outside. Stay hydrated."
 
const score = 45;
 
if (score >= 50) {
  console.log("You passed the exam.");
}
// No output (45 is not >= 50, so the block is skipped)

You can put any expression inside the parentheses. JavaScript evaluates it and converts the result to a boolean (true or false). If the result is true, the code block executes. If false, JavaScript skips the block entirely and moves to the next line after the closing brace.

How JavaScript Evaluates Conditions

The condition inside an if statement does not need to be an explicit true or false. JavaScript uses comparison and logical operators to produce boolean results:

javascriptjavascript
const age = 21;
const hasLicense = true;
const balance = 0;
 
// Comparison operators produce booleans
if (age >= 18) {
  console.log("Adult"); // Runs (21 >= 18 is true)
}
 
// Variables that are already booleans work directly
if (hasLicense) {
  console.log("Can drive"); // Runs (hasLicense is true)
}
 
// Be careful: 0 is falsy
if (balance) {
  console.log("Has funds"); // Does NOT run (0 is falsy)
}

Truthy and Falsy Values

JavaScript has a concept called "truthiness." When a non-boolean value appears in a condition, JavaScript converts it to true or false using specific rules. Understanding these rules is critical for writing correct conditions.

There are exactly seven falsy values in JavaScript. Everything else is truthy:

Falsy ValueTypeWhy It Matters
falseBooleanThe literal boolean false
0NumberZero, including -0
"" (empty string)StringA string with no characters
nullObjectIntentional absence of a value
undefinedUndefinedVariable declared but not assigned
NaNNumberResult of invalid math operations
0nBigIntBigInt zero

Everything else is truthy, including values that surprise beginners:

javascriptjavascript
// These are all TRUTHY (the if block runs)
if ("hello") { }     // Non-empty string
if (42) { }          // Non-zero number
if (-1) { }          // Negative numbers are truthy
if ([]) { }          // Empty array is truthy!
if ({}) { }          // Empty object is truthy!
if ("0") { }         // String "0" is truthy (it is not empty)
if ("false") { }     // String "false" is truthy (it is not empty)
 
// These are all FALSY (the if block is skipped)
if (0) { }           // Zero
if ("") { }          // Empty string
if (null) { }        // Null
if (undefined) { }   // Undefined
if (NaN) { }         // Not a Number
Empty Arrays and Objects Are Truthy

One of the most common beginner mistakes is assuming [] and {} are falsy because they are "empty." In JavaScript, any array and any object is truthy, regardless of content. To check if an array is empty, use if (array.length > 0). To check if an object has properties, use if (Object.keys(obj).length > 0).

Practical If Statement Patterns

Validating User Input

javascriptjavascript
function validateEmail(email) {
  if (typeof email !== "string") {
    console.log("Email must be a string");
    return false;
  }
 
  if (email.length === 0) {
    console.log("Email cannot be empty");
    return false;
  }
 
  if (!email.includes("@")) {
    console.log("Email must contain an @ symbol");
    return false;
  }
 
  if (!email.includes(".")) {
    console.log("Email must contain a domain");
    return false;
  }
 
  return true;
}
 
validateEmail("");           // "Email cannot be empty" โ†’ false
validateEmail("hello");      // "Email must contain an @ symbol" โ†’ false
validateEmail("ada@dev.io"); // โ†’ true

Checking Multiple Conditions

Use logical operators (&&, ||, !) to combine conditions:

javascriptjavascript
const user = {
  age: 25,
  hasAccount: true,
  isVerified: true,
  country: "US",
};
 
// AND (&&): all conditions must be true
if (user.age >= 18 && user.hasAccount && user.isVerified) {
  console.log("Full access granted");
}
 
// OR (||): at least one condition must be true
if (user.country === "US" || user.country === "CA") {
  console.log("North American user");
}
 
// NOT (!): inverts the condition
if (!user.isVerified) {
  console.log("Please verify your email");
}
 
// Combined: age check AND (US or CA)
if (user.age >= 21 && (user.country === "US" || user.country === "CA")) {
  console.log("Eligible for this service");
}

Guard Clauses for Early Returns

Guard clauses check for invalid conditions at the top of a function and return early, keeping the main logic un-nested and easy to read:

javascriptjavascript
function processPayment(order) {
  if (!order) {
    return { error: "No order provided" };
  }
 
  if (order.total <= 0) {
    return { error: "Order total must be positive" };
  }
 
  if (!order.paymentMethod) {
    return { error: "No payment method selected" };
  }
 
  if (order.total > 10000) {
    return { error: "Orders over $10,000 require manual review" };
  }
 
  // Main logic runs only when all guards pass
  const tax = order.total * 0.08;
  const finalTotal = order.total + tax;
 
  return {
    success: true,
    total: finalTotal,
    tax: tax,
  };
}

Single-Line If Statements

JavaScript allows you to omit the curly braces for single-statement if blocks:

javascriptjavascript
const age = 20;
 
// Without braces (single statement)
if (age >= 18) console.log("Adult");
 
// With braces (always recommended)
if (age >= 18) {
  console.log("Adult");
}
StyleExampleReadabilitySafety
No bracesif (x) doSomething();Compact but riskyEasy to break when adding lines
With bracesif (x) { doSomething(); }Clear and consistentSafe to extend
Always Use Curly Braces

Omitting braces is a known source of critical bugs. If you later add a second line, it runs unconditionally (outside the if block), but the indentation makes it look conditional. Apple's infamous "goto fail" SSL bug was caused by exactly this pattern. Always use braces, even for single-line blocks.

Using typeof in If Conditions

The typeof operator is commonly paired with if statements to check value types before operating on them:

javascriptjavascript
function formatValue(input) {
  if (typeof input === "string") {
    return input.toUpperCase();
  }
 
  if (typeof input === "number") {
    return input.toFixed(2);
  }
 
  if (typeof input === "boolean") {
    return input ? "Yes" : "No";
  }
 
  return String(input);
}
 
console.log(formatValue("hello"));  // "HELLO"
console.log(formatValue(3.14159));  // "3.14"
console.log(formatValue(true));     // "Yes"

Nested If Statements

You can place if statements inside other if statements. Use this sparingly; deep nesting makes code hard to read:

javascriptjavascript
function checkEligibility(user) {
  if (user.age >= 18) {
    if (user.hasValidId) {
      if (user.creditScore >= 650) {
        return "Approved";
      }
      return "Denied: credit score too low";
    }
    return "Denied: valid ID required";
  }
  return "Denied: must be 18 or older";
}

The nested version above works, but guard clauses produce cleaner code:

javascriptjavascript
function checkEligibility(user) {
  if (user.age < 18) {
    return "Denied: must be 18 or older";
  }
 
  if (!user.hasValidId) {
    return "Denied: valid ID required";
  }
 
  if (user.creditScore < 650) {
    return "Denied: credit score too low";
  }
 
  return "Approved";
}

Both functions produce identical results, but the flat structure is easier to read, test, and extend.

Best Practices

Writing Clean Conditionals

Follow these practices to write if statements that are easy to read and maintain.

Always use curly braces. Even for single-line blocks. It prevents bugs when code is modified later and keeps the style consistent across your codebase.

Use strict equality (===) in conditions. The === operator compares both value and type without coercion. Using == can produce unexpected results, like 0 == "" being true. Strict equality eliminates that ambiguity.

Prefer guard clauses over deep nesting. Check for failure conditions early and return. The main logic stays at the top level of the function, making it easier to follow.

Keep conditions simple and readable. If a condition has more than three parts, extract it into a named variable: const isEligible = age >= 18 && hasAccount && isVerified; then use if (isEligible).

Do not compare booleans to true or false. Write if (isActive) instead of if (isActive === true). The extra comparison adds noise without adding clarity.

Common Mistakes and How to Avoid Them

Watch Out for These Pitfalls

These if statement mistakes are among the most common bugs in beginner JavaScript code.

Using = instead of === in conditions. Writing if (x = 5) assigns 5 to x and always evaluates as truthy. Use === for comparison: if (x === 5). ESLint's no-cond-assign rule catches this automatically.

Assuming empty arrays are falsy. if ([]) evaluates to true because arrays are objects, and all objects are truthy. Check array.length > 0 to test if an array has elements.

Forgetting that 0 and empty string are falsy. Code like if (userAge) fails when userAge is 0 (a valid age for some calculations). Be explicit: if (userAge !== undefined && userAge !== null) or use the nullish coalescing pattern.

Checking for null without checking for undefined. In many cases, both null and undefined represent "no value." Use if (value == null) (one of the rare valid uses of loose equality) to catch both, or use if (value === null || value === undefined) for explicit checks.

Writing overly complex conditions. A condition like if (a > b && (c || d) && !(e && f)) is hard to debug. Break it into named booleans: const meetsAge = a > b; and const hasPermission = c || d; then combine: if (meetsAge && hasPermission && !isBlocked).

Next Steps

Add else branches to your conditions

Learn how to handle the false case with if else statements so your code responds to both outcomes.

Chain multiple conditions with else if

When you need more than two outcomes, else if chains let you test conditions in sequence until one matches.

Explore the [switch statement](/tutorials/programming-languages/javascript/js-switch-statement-vs-if-else-which-is-better)

For comparing a single value against many possible matches, the switch statement provides a cleaner alternative to long else if chains.

Learn the ternary operator

The ternary operator condenses simple if/else logic into a single expression, useful for assignments and return values.

Rune AI

Rune AI

Key Insights

  • Seven falsy values: false, 0, "", null, undefined, NaN, and 0n are the only falsy values; everything else is truthy
  • Always use braces and strict equality: curly braces prevent modification bugs, and === prevents type coercion surprises
  • Guard clauses over nesting: checking failure conditions early and returning produces flatter, more readable functions
  • Named conditions improve readability: extract complex boolean logic into descriptively named variables before the if check
RunePowered by Rune AI

Frequently Asked Questions

What is the difference between if and if else in JavaScript?

n `if` statement runs a code block only when the condition is true and does nothing when it is false. An `if else` statement handles both cases: one block runs when the condition is true, and a different block runs when it is false. Use plain `if` when you only need to act on the true case; use `if else` when both outcomes need distinct handling.

Can I use an if statement without curly braces?

Technically yes. JavaScript allows a single statement after `if` without braces: `if (x > 5) console.log("big");`. However, this practice is strongly discouraged because adding a second line later creates a bug where the new line runs regardless of the condition. Always use curly braces for safety and readability.

What are truthy and falsy values in JavaScript?

Falsy values are `false`, `0`, `""` (empty string), `null`, `undefined`, `NaN`, and `0n`. Every other value is truthy, including empty arrays `[]`, empty objects `{}`, and the string `"0"`. When a non-boolean value appears in an `if` condition, JavaScript converts it to `true` or `false` using these rules.

How do I check if a variable exists before using it in an if statement?

Use the `typeof` operator: `if (typeof myVar !== "undefined")`. This safely checks whether a variable has been declared and assigned. Alternatively, if the variable is declared but might be `null` or `undefined`, use `if (myVar != null)` to catch both values in one check.

Why does my if statement always run even when the condition seems false?

The most common cause is using `=` (assignment) instead of `===` (comparison). The expression `if (x = 5)` assigns 5 to `x` and evaluates as truthy. Another cause is truthy values you did not expect: `if ("false")` is `true` because any non-empty string is truthy. Always verify the actual type and value of what you are testing.

Conclusion

The if statement is the most fundamental control flow tool in JavaScript, and writing clean conditions is a skill that improves every function you build. The key to mastering it is understanding truthy and falsy values, using strict equality to avoid coercion bugs, and structuring your conditions with guard clauses instead of deep nesting. Once you are comfortable with basic if statements, the natural next step is learning if else for two-way branching and else if for multiple conditions.