逻辑运算符

逻辑与运算符

逻辑与运算符&&用于判断多个条件是否都为真。

基本用法

console.log(true && true);     // true
console.log(true && false);    // false
console.log(false && true);    // false
console.log(false && false);   // false

真值表

A B A && B 东巴文说明
true true true 全真为真
true false false 有假即假
false true false 有假即假
false false false 全假为假

返回值规则

// 返回的是操作数的值,不是布尔值
console.log(1 && 2);           // 2
console.log(0 && 2);           // 0
console.log("东巴文" && "学习"); // "学习"
console.log("" && "学习");      // ""

// 规则:第一个为真返回第二个,第一个为假返回第一个

应用场景

// 条件判断
let age = 20;
let hasID = true;
if (age >= 18 && hasID) {
    console.log("可以进入");
}

// 对象属性访问
let user = { name: "东巴文", address: { city: "北京" } };
console.log(user && user.address && user.address.city);  // "北京"

// ES2020可选链更简洁
console.log(user?.address?.city);  // "北京"

// 设置默认值(与||配合)
let config = {
    timeout: 0
};
let timeout = config.timeout || 3000;  // 3000(0是假值)
let timeout2 = config.timeout ?? 3000; // 0(??只对null/undefined)

逻辑或运算符

逻辑或运算符||用于判断多个条件是否有真值。

基本用法

console.log(true || true);     // true
console.log(true || false);    // true
console.log(false || true);    // true
console.log(false || false);   // false

真值表

A B A || B 东巴文说明
true true true 有真即真
true false true 有真即真
false true true 有真即真
false false false 全假为假

返回值规则

// 返回的是操作数的值,不是布尔值
console.log(1 || 2);           // 1
console.log(0 || 2);           // 2
console.log("东巴文" || "学习"); // "东巴文"
console.log("" || "学习");      // "学习"

// 规则:第一个为真返回第一个,第一个为假返回第二个

应用场景

// 设置默认值
function greet(name) {
    name = name || "访客";
    console.log(`你好,${name}`);
}
greet();           // "你好,访客"
greet("东巴文");   // "你好,东巴文"

// 条件判断
let role = "editor";
if (role === "admin" || role === "editor") {
    console.log("有编辑权限");
}

// 函数参数默认值(ES6更推荐)
function greet2(name = "访客") {
    console.log(`你好,${name}`);
}

逻辑非运算符

逻辑非运算符!将操作数转换为布尔值并取反。

基本用法

console.log(!true);            // false
console.log(!false);           // true
console.log(!1);               // false
console.log(!0);               // true
console.log(!"");              // true
console.log(!"东巴文");         // false
console.log(!null);            // true
console.log(!undefined);       // true

双重否定

// 双重否定用于转换为布尔值
console.log(!!1);              // true
console.log(!!0);              // false
console.log(!!"东巴文");        // true
console.log(!!"");             // false
console.log(!!null);           // false
console.log(!!undefined);      // false
console.log(!!{});             // true
console.log(!![]);             // true

应用场景

// 判断假值
function isEmpty(value) {
    return !value;
}
console.log(isEmpty(""));      // true
console.log(isEmpty("东巴文")); // false

// 切换布尔值
let isVisible = false;
function toggle() {
    isVisible = !isVisible;
}
toggle();  // isVisible = true
toggle();  // isVisible = false

// 数组去重(配合filter)
let arr = [0, 1, false, 2, "", 3, null, undefined];
let truthy = arr.filter(Boolean);  // [1, 2, 3]
let falsy = arr.filter(x => !x);   // [0, false, "", null, undefined]

短路求值

短路求值是逻辑运算符的重要特性,可以提高性能和简化代码。

&& 短路

// 第一个为假,不计算第二个
let x = 0;
false && (x = 1);
console.log(x);  // 0(x没有被赋值)

// 应用:条件执行
let user = { isAdmin: true };
user.isAdmin && console.log("管理员权限");  // 输出

// 等价于
if (user.isAdmin) {
    console.log("管理员权限");
}

|| 短路

// 第一个为真,不计算第二个
let x = 0;
true || (x = 1);
console.log(x);  // 0(x没有被赋值)

// 应用:默认值
let name = "";
let displayName = name || "匿名";
console.log(displayName);  // "匿名"

短路应用

// 1. 条件执行函数
let isLoggedIn = true;
isLoggedIn && loadUserData();

// 2. 默认值设置
let config = {
    theme: null
};
let theme = config.theme || "light";

// 3. 安全的对象访问
let user = null;
let city = (user && user.address && user.address.city) || "未知";

// 4. 函数参数验证
function divide(a, b) {
    b === 0 && console.warn("除数不能为0");
    return a / b;
}

逻辑运算符链式调用

多个条件

// 多个&&
let age = 25;
let hasID = true;
let hasTicket = true;

if (age >= 18 && hasID && hasTicket) {
    console.log("可以进入");
}

// 多个||
let role = "guest";
if (role === "admin" || role === "editor" || role === "author") {
    console.log("有权限");
}

// 混合使用
let isMember = true;
let isPremium = false;
if ((isMember || isPremium) && age >= 18) {
    console.log("可以访问");
}

优先级

// && 优先级高于 ||
console.log(true || false && false);  // true
// 等价于
console.log(true || (false && false)); // true

// 使用括号明确意图
console.log((true || false) && false); // false

链式返回值

// 返回第一个真值
let a = 0;
let b = "";
let c = "东巴文";
let d = "学习";
console.log(a || b || c || d);  // "东巴文"

// 返回最后一个值(全真时)
console.log(1 && 2 && 3);       // 3
console.log(1 && 0 && 3);       // 0

空值合并运算符

空值合并运算符??(ES2020)只对nullundefined进行默认值设置。

基本用法

console.log(null ?? "默认值");      // "默认值"
console.log(undefined ?? "默认值"); // "默认值"
console.log(0 ?? "默认值");         // 0
console.log("" ?? "默认值");        // ""
console.log(false ?? "默认值");     // false

与||的区别

// || 对所有假值生效
let timeout = 0;
console.log(timeout || 3000);   // 3000
console.log(timeout ?? 3000);   // 0

let text = "";
console.log(text || "默认文本"); // "默认文本"
console.log(text ?? "默认文本"); // ""

let flag = false;
console.log(flag || true);      // true
console.log(flag ?? true);      // false

应用场景

// 函数参数默认值
function config(options) {
    let timeout = options.timeout ?? 3000;
    let retries = options.retries ?? 3;
    console.log(timeout, retries);
}
config({ timeout: 0, retries: 0 });  // 0 0

// 配置合并
let defaults = {
    theme: "light",
    timeout: 3000
};
let userConfig = {
    theme: "dark",
    timeout: 0
};
let finalConfig = {
    theme: userConfig.theme ?? defaults.theme,
    timeout: userConfig.timeout ?? defaults.timeout
};

可选链运算符

可选链运算符?.(ES2020)用于安全访问对象属性。

基本用法

let user = {
    name: "东巴文",
    address: {
        city: "北京"
    }
};

console.log(user?.name);              // "东巴文"
console.log(user?.address?.city);     // "北京"
console.log(user?.phone?.number);     // undefined(不会报错)

// 传统写法
console.log(user && user.address && user.address.city);

方法调用

let obj = {
    method() {
        return "东巴文";
    }
};

console.log(obj.method?.());    // "东巴文"
console.log(obj.notExist?.());  // undefined

数组访问

let arr = [1, 2, 3];
console.log(arr?.[0]);          // 1
console.log(arr?.[10]);         // undefined

与空值合并配合

let user = null;
let city = user?.address?.city ?? "未知";
console.log(city);              // "未知"

逻辑运算符总结

运算符 名称 示例 东巴文说明
&& 逻辑与 a && b 全真为真,短路求值
|| 逻辑或 a || b 有真即真,短路求值
! 逻辑非 !a 取反
?? 空值合并 a ?? b 只对null/undefined生效
?. 可选链 obj?.prop 安全访问属性

下一步

掌握了逻辑运算符后,让我们继续学习:

  1. 其他运算符 - 学习其他运算符
  2. 条件语句 - 学习条件语句
  3. 循环语句 - 学习循环语句

东巴文(db-w.cn) - 让编程学习更简单

🔗 东巴文寄语:逻辑运算符是条件判断的核心,理解短路求值和返回值规则,掌握???.的新特性,能让你的代码更简洁、更安全。在 db-w.cn,我们帮你掌握每一个技巧!