逻辑与运算符&&用于判断多个条件是否都为真。
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)只对null和undefined进行默认值设置。
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 | 安全访问属性 |
掌握了逻辑运算符后,让我们继续学习:
东巴文(db-w.cn) - 让编程学习更简单
🔗 东巴文寄语:逻辑运算符是条件判断的核心,理解短路求值和返回值规则,掌握
??和?.的新特性,能让你的代码更简洁、更安全。在 db-w.cn,我们帮你掌握每一个技巧!