在 JavaScript 中,&、&&、|、|| 是常见的运算符,但它们的用途和行为有显著区别。其中 && 和 || 是逻辑运算符,而 & 和 | 是位运算符。下面详细解释它们的用法,并给出具体实例。
一、&&(逻辑与,Logical AND)
✅ 作用:
用于布尔逻辑判断。只有当**两个操作数都为真值(truthy)**时,结果才为 true,否则为 false。
✅ 特点:
- 短路求值(Short-circuit):如果第一个操作数为
false,则不会执行第二个操作。 - 返回的是实际值,不一定是布尔值(遵循“真值判断”规则)。
✅ 语法:
expr1 && expr2
✅ 实例:
// 基本布尔判断
console.log(true && false); // false
console.log(true && true); // true
// 返回实际值(非布尔)
console.log(5 && 3); // 3(两个都为真,返回第二个)
console.log(0 && 5); // 0(0 是 falsy,短路返回 0)
console.log('hello' && 'world'); // 'world'
console.log(null && 'hello'); // null(null 是 falsy,直接返回)
// 常用于条件执行
let user = { name: 'Alice' };
user && console.log(user.name); // 输出 'Alice'(安全访问)
二、||(逻辑或,Logical OR)
✅ 作用:
只要有一个操作数为真值,结果就是 true。
✅ 特点:
- 短路求值:如果第一个操作数为
true,则直接返回它,不执行第二个。 - 返回第一个真值,或最后一个值。
✅ 语法:
expr1 || expr2
✅ 实例:
console.log(true || false); // true
console.log(false || true); // true
// 返回实际值
console.log(0 || 5); // 5(0 是 falsy,返回 5)
console.log('' || 'default'); // 'default'
console.log(undefined || 'N/A'); // 'N/A'
console.log('hello' || 'world'); // 'hello'(第一个为真,直接返回)
// 常用于设置默认值
function greet(name) {
name = name || 'Guest';
console.log('Hello, ' + name);
}
greet(); // Hello, Guest
greet('Bob'); // Hello, Bob
⚠️ 注意:ES6 之后更推荐使用默认参数:
function greet(name = 'Guest')
三、&(按位与,Bitwise AND)
✅ 作用:
对两个数的二进制位进行“与”操作。只有当两个位都为 1 时,结果位才为 1。
✅ 操作流程:
- 将操作数转换为 32 位有符号整数。
- 对每一位执行 AND 操作。
- 返回结果。
✅ 实例:
// 例子:5 & 3
// 5 的二进制:101
// 3 的二进制:011
// 与操作: 001 → 即 1
console.log(5 & 3); // 1
console.log(6 & 2); // 2
// 6: 110, 2: 010 → 010 = 2
// 常用于权限位判断(如掩码)
const READ = 1; // 001
const WRITE = 2; // 010
const EXEC = 4; // 100
let permissions = READ | WRITE; // 3 (用户有读写权限)
if (permissions & READ) {
console.log('有读权限'); // 会执行
}
四、|(按位或,Bitwise OR)
✅ 作用:
对两个数的二进制位进行“或”操作。只要有一个位为 1,结果位就为 1。
✅ 实例:
// 例子:5 | 3
// 5: 101
// 3: 011
// 或:111 → 即 7
console.log(5 | 3); // 7
console.log(2 | 4); // 6
// 2: 010, 4: 100 → 110 = 6
// 常用于权限组合
let userPerm = READ | EXEC; // 读 + 执行权限
console.log(userPerm); // 5
❗ 常见误区
// ❌ 错误:混淆 && 和 &
console.log(true && 1); // 1(逻辑与)
console.log(true & 1); // 1(但这是按位操作,true 被转为 1)
// ❌ 错误:用 || 设置 0 为默认值
let value = 0;
let result = value || 10; // result = 10,但 0 是有效值!
// ✅ 应改为:
let result = (value !== undefined) ? value : 10;
// 或使用 ES6 默认参数 / nullish 合并
let result = value ?? 10; // 只有 null/undefined 才替换
✅ 最佳实践建议
- 使用
&&和||进行逻辑判断和默认值处理。 - 使用
&和|处理底层位操作(如权限、状态标志)。 - 对于默认值,优先使用
??(空值合并) 而非||,避免0、''等有效值被误判。
const count = userInput ?? 0; // 更安全
希望这些解释和实例能帮你彻底掌握这四个运算符!🌟