Welcome back! 👋 In the previous lesson, you mastered the if else ladder for handling multiple conditions. Now let's learn a powerful shorthand that every JavaScript developer uses daily — the Ternary Operator!
The ternary operator lets you write a simple if...else in a single, clean line. Once you get comfortable with it, you'll find yourself reaching for it constantly — in assignments, template literals, JSX, and more.
Let's break it down completely!
What is the Ternary Operator?
The ternary operator is the only JavaScript operator that takes three operands — that's where the name "ternary" comes from (Latin for "composed of three parts").
It's also called the conditional operator because it evaluates a condition and returns one of two values.
The Problem it Solves
Without the ternary operator, even simple two-way assignments need 5 lines:
// ❌ Verbose if...else just to assign a value
let age = 20;
let access;
if (age >= 18) {
access = "Allowed";
} else {
access = "Denied";
}
console.log(access); // "Allowed"With the ternary operator, this collapses to one line:
// ✅ Clean and concise with ternary
let age = 20;
let access = age >= 18 ? "Allowed" : "Denied";
console.log(access); // "Allowed"Same logic. Same result. Far less code.
Syntax
condition ? expressionIfTrue : expressionIfFalsecondition— any expression that evaluates to truthy or falsy?— separates the condition from the true branchexpressionIfTrue— value/expression returned if condition is truthy:— separates the true branch from the false branchexpressionIfFalse— value/expression returned if condition is falsy
Think of it as a condensed question: "Is this true? If yes → give this. If no → give that."
Basic Examples
Assigning a Value
let score = 75;
let result = score >= 50 ? "Pass ✅" : "Fail ❌";
console.log(result); // "Pass ✅"Checking a Boolean
let isLoggedIn = false;
let message = isLoggedIn ? "Welcome back! 👋" : "Please log in.";
console.log(message); // "Please log in."Using Numbers
let temperature = 38;
let weather = temperature > 30 ? "Hot 🔥" : "Cool 🌬️";
console.log(weather); // "Hot 🔥"Comparing Strings
let day = "Sunday";
let type = day === "Saturday" || day === "Sunday" ? "Weekend 🎉" : "Weekday 💼";
console.log(type); // "Weekend 🎉"Ternary vs if...else
The ternary operator is not a replacement for all if...else — it's best suited for simple, two-outcome expressions. Here's when to use each:
| Situation | Use |
|---|---|
| Simple value assignment (true/false) | Ternary ✅ |
| Calling a function based on condition | Ternary ✅ |
| Inside template literals | Ternary ✅ |
| Inside JSX (React) | Ternary ✅ |
| Multiple lines of logic per branch | if...else ✅ |
| More than two outcomes | if...else if ✅ |
| Complex, hard-to-read conditions | if...else ✅ |
Ternary in Template Literals
One of the most practical uses of the ternary operator is inside template literals — keeping your string building clean and inline.
let cartItems = 3;
console.log(`You have ${cartItems} item${cartItems !== 1 ? "s" : ""} in your cart.`);
// Output: You have 3 items in your cart.
let cartItems2 = 1;
console.log(`You have ${cartItems2} item${cartItems2 !== 1 ? "s" : ""} in your cart.`);
// Output: You have 1 item in your cart.let username = "Mihir";
let isAdmin = true;
console.log(`Hello, ${username}! You are logged in as ${isAdmin ? "Admin 🔑" : "User 👤"}.`);
// Output: Hello, Mihir! You are logged in as Admin 🔑.let stock = 0;
console.log(`Status: ${stock > 0 ? `${stock} units available 🟢` : "Out of stock 🔴"}`);
// Output: Status: Out of stock 🔴Ternary for Function Calls
You can use the ternary operator to decide which function to call based on a condition.
function greetMorning() {
console.log("Good morning! ☀️");
}
function greetEvening() {
console.log("Good evening! 🌙");
}
let hour = 14;
hour < 12 ? greetMorning() : greetEvening();
// Output: Good evening! 🌙let isError = true;
isError
? console.log("❌ Something went wrong. Please try again.")
: console.log("✅ Operation successful!");
// Output: ❌ Something went wrong. Please try again.Ternary with Calculations
The ternary operator works great for quick conditional calculations.
// Absolute value
let num = -15;
let absValue = num >= 0 ? num : -num;
console.log(absValue); // 15
// Even or odd
let number = 7;
let parity = number % 2 === 0 ? "Even" : "Odd";
console.log(parity); // "Odd"
// Discount calculation
let isMember = true;
let price = 1000;
let finalPrice = isMember ? price * 0.85 : price;
console.log(`Final Price: ₹${finalPrice}`); // Final Price: ₹850
// Max of two numbers
let a = 45;
let b = 72;
let max = a > b ? a : b;
console.log(`Max: ${max}`); // Max: 72Ternary with null / undefined Checks
A very common real-world pattern — safely handling missing data.
// Check for null/undefined before using a value
let userName = null;
let displayName = userName ? userName : "Guest";
console.log(displayName); // "Guest"
let userName2 = "Mihir";
let displayName2 = userName2 ? userName2 : "Guest";
console.log(displayName2); // "Mihir"// Displaying optional data safely
let user = {
name: "Priya",
phone: null
};
console.log(`Phone: ${user.phone ? user.phone : "Not provided"}`);
// Output: Phone: Not providedPro Tip: For null/undefined checks specifically, JavaScript also has the Nullish Coalescing Operator (??) which is even more precise:
let phone = null;
// Ternary way
let display1 = phone ? phone : "Not provided";
// Nullish coalescing — only triggers for null or undefined (not 0 or "")
let display2 = phone ?? "Not provided";
console.log(display1); // "Not provided"
console.log(display2); // "Not provided"Nested Ternary Operator
A nested ternary is a ternary inside another ternary — used to handle more than two outcomes.
How it Works
condition1 ? valueA : condition2 ? valueB : valueCExample
let marks = 82;
let grade = marks >= 90 ? "A"
: marks >= 75 ? "B"
: marks >= 60 ? "C"
: marks >= 40 ? "D"
: "F";
console.log(`Grade: ${grade}`); // Grade: B⚠️ Use Nested Ternary Very Sparingly
While nested ternaries work, they quickly become unreadable — especially for other developers (or yourself 3 months later).
// ❌ Hard to read — what is even happening here?
let x = 10;
let result = x > 20 ? "big" : x > 10 ? "medium" : x > 5 ? "small" : "tiny";
// ✅ Much clearer with if...else if
let result;
if (x > 20) {
result = "big";
} else if (x > 10) {
result = "medium";
} else if (x > 5) {
result = "small";
} else {
result = "tiny";
}Rule of thumb: If you need more than one level of nesting, switch to an if...else if ladder instead.
Ternary in Objects and Arrays
You can use the ternary operator directly inside object declarations and array building.
// Object property value
let isPremium = true;
let userPlan = {
name: "Mihir",
plan: isPremium ? "Premium 🌟" : "Free",
maxUploads: isPremium ? 1000 : 10,
support: isPremium ? "24/7 Priority" : "Community only"
};
console.log(userPlan);
// { name: 'Mihir', plan: 'Premium 🌟', maxUploads: 1000, support: '24/7 Priority' }// Building arrays conditionally
let isAdmin = false;
let menuItems = ["Home", "About", "Contact", ...(isAdmin ? ["Dashboard", "Settings"] : [])];
console.log(menuItems);
// ['Home', 'About', 'Contact']Real-World Examples
Example 1: Login Status Banner
let isLoggedIn = true;
let userName = "Mihir";
let banner = isLoggedIn
? `Welcome back, ${userName}! 👋`
: "Please sign in to continue.";
console.log(banner);
// Output: Welcome back, Mihir! 👋Example 2: Shopping Cart Button
let itemsInCart = 0;
let buttonText = itemsInCart > 0
? `Checkout (${itemsInCart} items) 🛒`
: "Your cart is empty";
console.log(buttonText);
// Output: Your cart is emptyExample 3: Password Strength Indicator
let password = "Js@secure123";
let strength = password.length >= 12 ? "Strong 🟢"
: password.length >= 8 ? "Medium 🟡"
: "Weak 🔴";
console.log(`Password Strength: ${strength}`);
// Output: Password Strength: Strong 🟢Example 4: Responsive Greeting
let hour = new Date().getHours();
let greeting = hour < 12 ? "Good morning ☀️"
: hour < 17 ? "Good afternoon 🌤️"
: hour < 21 ? "Good evening 🌆"
: "Good night 🌙";
console.log(greeting);Example 5: Order Status Display
function getOrderStatus(status) {
let label = status === "delivered" ? "✅ Delivered"
: status === "shipped" ? "🚚 On the way"
: status === "processing" ? "⚙️ Processing"
: status === "cancelled" ? "❌ Cancelled"
: "❓ Unknown";
console.log(`Order Status: ${label}`);
}
getOrderStatus("shipped"); // Order Status: 🚚 On the way
getOrderStatus("delivered"); // Order Status: ✅ Delivered
getOrderStatus("cancelled"); // Order Status: ❌ Cancelled
getOrderStatus("refunded"); // Order Status: ❓ UnknownCommon Mistakes
Mistake 1: Using Ternary for Multi-line Logic
let isAdmin = true;
// ❌ Wrong — ternary isn't meant for multi-line blocks
let result = isAdmin
? (console.log("Admin access granted"), setupAdminPanel(), loadDashboard())
: (console.log("Access denied"), redirectToLogin());
// ✅ Correct — use if...else for multiple operations
if (isAdmin) {
console.log("Admin access granted");
setupAdminPanel();
loadDashboard();
} else {
console.log("Access denied");
redirectToLogin();
}Mistake 2: Forgetting the : (False Branch)
let age = 15;
// ❌ Wrong — missing the : and false branch
let category = age >= 18 ? "Adult"; // SyntaxError!
// ✅ Correct — always include both branches
let category = age >= 18 ? "Adult" : "Minor";Mistake 3: Deeply Nested Ternary
let score = 85;
// ❌ Unreadable mess
let grade = score >= 90 ? "A" : score >= 80 ? "B" : score >= 70 ? "C" : score >= 60 ? "D" : "F";
// ✅ Break it across lines or use if...else if
let grade = score >= 90 ? "A"
: score >= 80 ? "B"
: score >= 70 ? "C"
: score >= 60 ? "D"
: "F";Mistake 4: Ternary Without Returning a Value
// ❌ Ternary used for side effects with no return — bad style
isLoggedIn ? console.log("Welcome") : console.log("Login");
// ✅ Better — use if...else when there's no value to return
if (isLoggedIn) {
console.log("Welcome");
} else {
console.log("Login");
}
// ✅ Ternary is great when there IS a value to assign or embed
let message = isLoggedIn ? "Welcome" : "Login";
console.log(message);Mistake 5: Confusing ? with Optional Chaining ?.
let user = null;
// ❌ This is NOT a ternary — it's optional chaining
console.log(user?.name); // undefined (no error)
// ✅ Ternary requires a full condition + true/false branch
let name = user ? user.name : "Guest";
console.log(name); // "Guest"Practical Exercise: Ternary Operator in Action
Create a file called ternary-demo.js:
// 🎯 Exercise: Ternary Operator Practice
// 1. Number utilities
function numberUtils(num) {
console.log(`\n=== Number: ${num} ===`);
let type = typeof num === "number" && !isNaN(num) ? "Valid Number ✅" : "Not a Number ❌";
let sign = num > 0 ? "Positive ➕" : num < 0 ? "Negative ➖" : "Zero";
let parity = num % 2 === 0 ? "Even" : "Odd";
let absVal = num >= 0 ? num : -num;
console.log("Type:", type);
console.log("Sign:", sign);
console.log("Parity:", parity);
console.log("Absolute Value:", absVal);
}
numberUtils(42);
numberUtils(-7);
numberUtils(0);
numberUtils(NaN);
// 2. User profile display
function displayProfile(user) {
console.log("\n=== User Profile ===");
let name = user.name ? user.name : "Anonymous";
let email = user.email ? user.email : "No email on file";
let role = user.isAdmin ? "Admin 🔑" : "User 👤";
let status = user.active ? "Active 🟢" : "Inactive 🔴";
let greeting = user.name ? `Hello, ${user.name}!` : "Hello, stranger!";
console.log("Name:", name);
console.log("Email:", email);
console.log("Role:", role);
console.log("Status:", status);
console.log("Greeting:", greeting);
}
displayProfile({ name: "Mihir", email: "mihir@example.com", isAdmin: true, active: true });
displayProfile({ name: "", email: null, isAdmin: false, active: false });
// 3. Product availability
function checkProduct(product) {
console.log(`\n=== ${product.name} ===`);
let stockMsg = product.stock > 50 ? "Well Stocked 🟢"
: product.stock > 10 ? "Low Stock 🟡"
: product.stock > 0 ? "Almost Gone 🔴"
: "Out of Stock ❌";
let priceMsg = product.onSale
? `₹${product.price * 0.8} (20% OFF 🏷️)`
: `₹${product.price}`;
console.log("Stock Status:", stockMsg);
console.log("Price:", priceMsg);
}
checkProduct({ name: "Laptop", stock: 5, price: 60000, onSale: true });
checkProduct({ name: "Headphone", stock: 0, price: 2000, onSale: false });
checkProduct({ name: "Mouse", stock: 80, price: 800, onSale: true });Run it:
node ternary-demo.jsExpected Output:
=== Number: 42 ===
Type: Valid Number ✅
Sign: Positive ➕
Parity: Even
Absolute Value: 42
=== User Profile ===
Name: Mihir
Email: mihir@example.com
Role: Admin 🔑
Status: Active 🟢
Greeting: Hello, Mihir!
=== Laptop ===
Stock Status: Almost Gone 🔴
Price: ₹48000 (20% OFF 🏷️)Key Takeaways
Congratulations! 🎉 You now know how to write clean, concise conditionals using the ternary operator.
✅ Ternary operator is a one-line shorthand for if...else — perfect for simple two-outcome logic.
✅ Syntax:
condition ? valueIfTrue : valueIfFalse✅ Best used for:
- Assigning a value based on a condition
- Embedding conditions inside template literals
- Conditional values inside objects and arrays
- Simple two-outcome function calls
✅ Avoid ternary when:
- You have more than 2 outcomes (use
if...else ifinstead) - Each branch has multiple lines of logic (use
if...else) - It makes the code hard to read at first glance
✅ Nested ternary:
- Possible but use sparingly — maximum one level of nesting
- Always format across multiple lines if nested
✅ Related operator:
??(Nullish Coalescing) — a sharper tool specifically fornull/undefinedfallbacks
Best Practices
- ✅ Use ternary for simple, single-expression true/false decisions
- ✅ Always include both branches — the
?(true) and the:(false) - ✅ Format nested ternaries across multiple lines for readability
- ✅ Never use ternary for side effects only (like logging) — use
if...elseinstead - ✅ Limit nesting to one level deep — any deeper and readability suffers
- ✅ Use ternary freely inside template literals and JSX — it's idiomatic there
- ✅ Prefer
??over ternary when checking specifically fornullorundefined - ✅ When in doubt — ask yourself: "Would a new developer understand this in 5 seconds?"
What's Next?
Excellent work! 🎉 You've added the ternary operator to your JavaScript toolkit — you'll be using it every single day.
In the next lesson, we'll cover the final conditional tool:
- Switch Case — the cleanest way to match one value against many exact options
You're making great progress through JavaScript conditionals — keep it up! 💪