【问题标题】:Refactoring A && B && B > A重构 A && B && B > A
【发布时间】:2021-10-05 13:54:51
【问题描述】:

有没有办法重构这个逻辑表达式?

A && B && B > A

刚刚学习,我想知道写相同表达式的另一种方法 谢谢

【问题讨论】:

  • 你认为这个表达式代表什么?什么是 A 和 B?
  • Scott Hunter,是布尔值

标签: javascript logic


【解决方案1】:

拆分表达式并将它们放入具有可读名称的变量中。

由于缺乏关于 A 和 B 是什么的信息,我假设表达式的前半部分确保两个值都是真实的,然后您比较它们:

const bothTruthy= A && B;
const BLargerThanA = B > A;

const yourExpression = bothTruthy && BLargerThanA;

【讨论】:

  • 我在我的回答中测试了这个解决方案,它可以工作,但lazy evaluation 在这个解决方案中不起作用
  • 所以这将是相同的表达式,但更具可读性
【解决方案2】:

更新:

好的,以下解决方案不适用于所有情况。

如果您希望 AB 被解释为 true,我认为您不需要重构您的表达式逻辑。在处理逻辑表达式的过程中,引擎独立优化并执行lazy way,例如:如果表达式A && (B || C)中的值A被解释为false,那么表达式的处理将立即结束并返回值Afalse 或等效值),但如果A 的值被解释为true,则条件处理将继续。此外,如果B 被解释为true,那么由于逻辑加法(OR),处理将以等于true 的值结束,如果B 被解释为@ 987654335@,然后继续处理...


试试这个 - A && (B > A)

const cases = [
  [true, false],
  [false, true],
  [false, false],
  [true, true],
  [1, 2],
  [2, 1],
  [1, 0],
  [0, 1],
  [undefined, 1],
  [1, undefined],
  [undefined, 0],
  [0, undefined],
  [null, undefined],
  [undefined, null],
  [1, NaN],
  [NaN, 1],
  [0, NaN],
  [NaN, 0],
  [{}, 0],
  [1, {}],
  [{}, []],
  [[], {}],
  ['2', 1],
  [1, '2'],
  [true, 1],
  [1, true],
  [true, '1'],
  ['1', true],
  [0, -1],
  [-1, 0],
  [1, -1],
  [-1, 1],
  [false, -1],
  [-1, false]
];

const fails = [];

cases.forEach((c) => {
  const [A, B] = c;
  const r1 = A && B && (B > A);
  const r2 = A && (B > A); // <-- simplified condition
  const r = !!r1 === !!r2;
  if (!r) fails.push({c: c, r1, r2});
});

if (fails.length > 0) {
  console.log('Not all cases passed!');
  console.log(fails);
} else {
  console.log('All cases passed!');
}
.as-console-wrapper { min-height: 100%!important; top: 0; }

【讨论】:

  • A为负且B为0或null时简化表达式失败,但A或B为0时可能原始表达式不正确(我不知道请求是否忽略了数字 0,或仅用于空值)
  • @ManuelRomeiro 好的,我添加了额外的测试。我会考虑如何解决它
  • 不是同一个表达式 A && (B > A)
  • @Bernardao 我知道我已经更新了答案,请阅读我添加的内容
猜你喜欢
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2014-03-29
  • 2011-10-20
  • 2016-02-23
  • 2021-10-06
  • 2017-04-06
  • 1970-01-01
相关资源
最近更新 更多