js中的&&、&、||、|运算符

2,069 阅读3分钟

在 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

✅ 操作流程:

  1. 将操作数转换为 32 位有符号整数。
  2. 对每一位执行 AND 操作。
  3. 返回结果。

✅ 实例:

// 例子: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;  // 更安全

希望这些解释和实例能帮你彻底掌握这四个运算符!🌟