Skip to content

JavaScript逻辑运算

布尔逻辑和逻辑运算在JavaScript开发中可能不经常出现,但当它们出现时,你会很高兴知道如何使用它们。让我们来探索一些在JavaScript中常见的逻辑运算以及如何以函数式风格实现它们。

逻辑与

逻辑与&&)运算符如果两个操作数都为true,则返回true,否则返回false

const and = (a, b) => a && b;

and(true, true); // true
and(true, false); // false
and(false, false); // false
a b a && b
true true true
true false false
false true false
false false false

逻辑或

逻辑或||)运算符如果至少有一个操作数为true,则返回true,否则返回false

const or = (a, b) => a || b;

## 逻辑或

逻辑或(`||`)运算符返回两个操作数中的任意一个为`true`,则返回`true`,否则返回`false`。

```js
const or = (a, b) => a || b;

or(true, true); // true
or(true, false); // true
or(false, false); // false
a b a || b
true true true
true false true
false true true
false false false

逻辑非

逻辑非(!)运算符如果操作数为false,则返回true,否则返回false

const not = a => !a;

not(true); // false
not(false); // true
a !a
true false
false true

逻辑异或

逻辑异或(^)运算符如果两个操作数中只有一个为true,则返回true,否则返回false

[!NOTE]

虽然JavaScript实现了异或(^)运算符,但它只用于位运算。它不是一个逻辑运算符,因此不能用于布尔值。要实现逻辑异或运算符,我们可以使用前面的逻辑运算符的组合。

const nand = (a, b) => !(a && b);

nand(true, true); // false
nand(true, false); // true
nand(false, true); // true
nand(false, false); // true
a b !(a && b)
true true false
true false true
false true true
false false true

逻辑异或

逻辑异或运算符是逻辑或和逻辑非运算符的组合。如果两个操作数中有且仅有一个为true,则返回true,否则返回false

const xor = (a, b) => (( a || b ) && !( a && b ));

xor(true, true); // false
xor(true, false); // true
xor(false, true); // true
xor(false, false); // false
a b a ^ b
true true false
true false true
false true true
false false false

逻辑非或

逻辑非或运算符是逻辑非和逻辑或运算符的组合。如果两个操作数都为false,则返回true,否则返回false

const nor = (a, b) => !(a||b);

nor(true, true); // false
nor(true, false); // false
nor(false, false); // true
a b !(a || b)
true true false
true false false
false true false
false false true

逻辑非与

逻辑非与运算符是逻辑非和逻辑与运算符的组合。如果至少有一个操作数为false,则返回true,否则返回false

const nand = (a, b) => !(a&&b);

nand(true, true); // false
nand(true, false); // true
nand(false, false); // true
a b !(a && b)
true true false
true false true
false true true
false false true

使用函数实现逻辑运算

我们之前看到的逻辑运算是使用布尔值进行操作的,但是如果我们想要使用函数进行操作怎么办呢?例如,如果我们想要检查两个函数在给定的参数集上是否都返回true,我们就需要修改它们以使其适用于函数。下面是使用函数实现逻辑与、或和非运算符的示例:

// 函数的逻辑与
const both = (f, g) => (...args) => f(...args) && g(...args);
// 函数的逻辑或
const either = (f, g) => (...args) => f(...args) || g(...args);
// 函数的逻辑非
const complement = fn => (...args) => !fn(...args);

实际上,我们可以使用高阶函数来实现任何二元逻辑运算符的函数通用实现。

const logicalOperator =
  operatorFn =>
  (f, g) =>
  (...args) =>
    operatorFn(f(...args), g(...args));

const and = (a, b) => a && b;
const or = (a, b) => a || b;

const both = logicalOperator(and);
const either = logicalOperator(or);

```javascript
const isEven = num => num % 2 === 0;
const isPositive = num => num > 0;
const isPositiveAndEven = both(isEven, isPositive);
const isPositiveOrEven = either(isEven, isPositive);

isPositiveAndEven(4); // true
isPositiveAndEven(-2); // false
isPositiveOrEven(4); // true
isPositiveOrEven(-2); // true
const isEven = num => num % 2 === 0;
const isPositive = num => num > 0;
const isPositiveAndEven = both(isEven, isPositive);
const isPositiveOrEven = either(isEven, isPositive);

isPositiveAndEven(4); // true
isPositiveAndEven(-2); // false
isPositiveOrEven(4); // true
isPositiveOrEven(-2); // true