重构 A && B && B > A
Refactoring A && B && B > A
有重构这个逻辑表达式的方法吗?
A && B && B > A
刚刚学习,想知道同样的表达式的另一种写法
谢谢
更新:
好的,以下解决方案并不适用于所有情况。
如果您希望 A
和 B
被解释为 true,我认为您不需要重构表达式逻辑。在逻辑表达式的处理过程中,引擎会独立优化它们并执行lazy way,例如:如果表达式A && (B || C)
中的值A
被解释为 false
,则表达式的处理将立即结束并返回值 A
(false
或等效值),但如果 A
被解释为 true
,则条件的处理将继续。此外,如果 B
被解释为 true
,则由于 逻辑加法 (OR),处理将以等于 true
的值结束,如果 B
被解释为 false
,则处理将继续...
试试这个 - 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 是什么的信息,我假设表达式的前半部分确保两个值都为真,然后您比较它们:
const bothTruthy= A && B;
const BLargerThanA = B > A;
const yourExpression = bothTruthy && BLargerThanA;
有重构这个逻辑表达式的方法吗?
A && B && B > A
刚刚学习,想知道同样的表达式的另一种写法 谢谢
更新:
好的,以下解决方案并不适用于所有情况。
如果您希望 A
和 B
被解释为 true,我认为您不需要重构表达式逻辑。在逻辑表达式的处理过程中,引擎会独立优化它们并执行lazy way,例如:如果表达式A && (B || C)
中的值A
被解释为 false
,则表达式的处理将立即结束并返回值 A
(false
或等效值),但如果 A
被解释为 true
,则条件的处理将继续。此外,如果 B
被解释为 true
,则由于 逻辑加法 (OR),处理将以等于 true
的值结束,如果 B
被解释为 false
,则处理将继续...
试试这个 - 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 是什么的信息,我假设表达式的前半部分确保两个值都为真,然后您比较它们:
const bothTruthy= A && B;
const BLargerThanA = B > A;
const yourExpression = bothTruthy && BLargerThanA;