Start learning free

LESSON 85 OF 410 · CONDITIONAL STATEMENTS

Combining Logical Operators

Lesson Read the full explanation

Sometimes we need to combine logical operators to evaluate more complex conditions. For example:

7 >= 10 && (5 == 7 || 9 < 12) // Evaluates to false

Notice that we used parentheses to group 5 == 7 and 9 < 12 together. The computer interprets this line of code as condition1 && condition2 where:

  • condition1 is 7 >= 10, which is false
  • condition2 is (5 == 7 || 9 < 12), which is true
At least one of condition1 and condition2 is false, so the entire condition is false.

It is very important to use parentheses to tell the computer how to group the conditions together. If we change the parentheses in the example above to:

(7 >= 10 && 5 == 7) || 9 < 12 // Evaluates to true

Now the computer interprets this line of code as condition1 || condition2 where:

  • condition1 is (7 >= 10 && 5 == 7), which is false
  • condition2 is 9 < 12, which is true
At least one of condition1 and condition2 is true, so the entire condition is true.

Assignment
Follow the Coding Tutorial and let's combine some logical operators.


Hint
Look at the examples above if you get stuck.


STEP 1 OF 2
    Ctrl + Enter to check

    JAVASCRIPT · CONDITIONAL STATEMENTS

    Combining Logical Operators in JavaScript, explained

    Introduction

    In programming, logical operators are used to form complex conditions by combining multiple simple conditions. This is particularly useful in decision-making processes where multiple criteria need to be evaluated. Logical operators such as && (AND), || (OR), and ! (NOT) are fundamental in controlling the flow of a program.

    Understanding the Basics

    Logical operators allow us to combine multiple boolean expressions. The three main logical operators are:

    • && (AND): Returns true if both operands are true.
    • || (OR): Returns true if at least one of the operands is true.
    • ! (NOT): Returns true if the operand is false.

    For example:

    true && false // Evaluates to false
    true || false // Evaluates to true
    !true // Evaluates to false
    

    Main Concepts

    Combining logical operators allows us to create more complex conditions. Parentheses are used to group conditions and control the order of evaluation. For example:

    let a = 5;
    let b = 10;
    let c = 15;
    
    if ((a < b && b < c) || c > 20) {
        console.log("Condition is true");
    } else {
        console.log("Condition is false");
    }
    // Evaluates to "Condition is true"
    

    In this example, the condition (a < b && b < c) || c > 20 is evaluated. Since a < b and b < c are both true, the entire condition evaluates to true.

    Examples and Use Cases

    Let's look at some practical examples:

    let age = 25;
    let hasLicense = true;
    let isSober = true;
    
    if (age >= 18 && hasLicense && isSober) {
        console.log("You can drive");
    } else {
        console.log("You cannot drive");
    }
    // Evaluates to "You can drive"
    

    In this example, all conditions must be true for the person to be allowed to drive.

    Common Pitfalls and Best Practices

    Common mistakes include:

    • Not using parentheses to group conditions properly.
    • Misunderstanding the precedence of logical operators.

    Best practices include:

    • Always use parentheses to make the code more readable and to ensure the correct order of evaluation.
    • Write clear and concise conditions.

    Advanced Techniques

    Advanced techniques involve combining logical operators with other control structures like loops and functions. For example:

    function canVote(age, citizenship) {
        return age >= 18 && citizenship === 'USA';
    }
    
    let voters = [
        { name: 'Alice', age: 30, citizenship: 'USA' },
        { name: 'Bob', age: 17, citizenship: 'USA' },
        { name: 'Charlie', age: 25, citizenship: 'Canada' }
    ];
    
    voters.forEach(voter => {
        if (canVote(voter.age, voter.citizenship)) {
            console.log(voter.name + " can vote");
        } else {
            console.log(voter.name + " cannot vote");
        }
    });
    // Evaluates to:
    // Alice can vote
    // Bob cannot vote
    // Charlie cannot vote
    

    Code Implementation

    Here is a well-commented code snippet demonstrating the use of logical operators:

    // Function to check if a person can enter a club
    function canEnterClub(age, isMember) {
        // Person can enter if they are at least 21 years old or if they are a member
        return age >= 21 || isMember;
    }
    
    let people = [
        { name: 'John', age: 20, isMember: true },
        { name: 'Jane', age: 22, isMember: false },
        { name: 'Jim', age: 19, isMember: false }
    ];
    
    people.forEach(person => {
        if (canEnterClub(person.age, person.isMember)) {
            console.log(person.name + " can enter the club");
        } else {
            console.log(person.name + " cannot enter the club");
        }
    });
    // Evaluates to:
    // John can enter the club
    // Jane can enter the club
    // Jim cannot enter the club
    

    Debugging and Testing

    When debugging logical conditions, use console.log to print intermediate results. For example:

    let a = 5;
    let b = 10;
    let c = 15;
    
    console.log(a < b); // true
    console.log(b < c); // true
    console.log(a < b && b < c); // true
    console.log(c > 20); // false
    console.log((a < b && b < c) || c > 20); // true
    

    Testing logical conditions can be done using unit tests. For example, using a testing framework like Jest:

    const canEnterClub = require('./canEnterClub');
    
    test('Person can enter the club', () => {
        expect(canEnterClub(21, false)).toBe(true);
        expect(canEnterClub(20, true)).toBe(true);
        expect(canEnterClub(19, false)).toBe(false);
    });
    

    Thinking and Problem-Solving Tips

    When approaching problems involving logical operators:

    • Break down the problem into smaller, manageable parts.
    • Write out the conditions in plain language before translating them into code.
    • Use truth tables to understand how different combinations of conditions will evaluate.

    Conclusion

    Mastering logical operators is crucial for making complex decisions in your code. By understanding how to combine and evaluate conditions, you can write more efficient and effective programs. Practice regularly to improve your skills and explore more advanced applications.

    Additional Resources

    For further reading and practice, check out these resources:

    Keep going with JavaScriptAbout 340 step-by-step lessons, from your first line of code to coding interviews. Free to start.
    Start learning free