#javascript #logic
Вопрос:
Есть способ реорганизовать это логическое выражение?
A amp;amp; B amp;amp; B > A
Просто учусь, и я хотел бы знать другой способ написания того же выражения
Спасибо
Комментарии:
1. Как вы думаете, что представляет собой это выражение? Что такое А и В?
2. Скотт Хантер, являются логическими
Ответ №1:
Разделите выражения и поместите их в переменные с удобочитаемыми именами.
Из-за отсутствия информации о том, что такое A и B, я предполагаю, что первая половина выражения гарантирует, что оба значения верны, а затем вы их сравниваете:
const bothTruthy= A amp;amp; B;
const BLargerThanA = B > A;
const yourExpression = bothTruthy amp;amp; BLargerThanA;
Комментарии:
1. Я протестировал это решение в тестах из своего ответа, оно работает, но ленивая оценка не работает в этом решении
2. Таким образом, это будет то же самое выражение, но в более удобочитаемом виде
Ответ №2:
Обновить:
Хорошо, приведенное ниже решение работает не для всех случаев.
Я думаю, что вам не нужно перестраивать логику выражения, если вы хотите A
, B
чтобы ее интерпретировали как истинную. Во время обработки логических выражений механизм самостоятельно оптимизирует их и выполняет ленивый способ, например: если в выражении A amp;amp; (B || C)
значение A
интерпретируется как false
, то обработка выражения немедленно завершится и значение A
будет возвращено ( false
или эквивалентное значение), но если значение A
интерпретируется как true
, то обработка условия будет продолжена. Далее, если B
интерпретируется как true
, то из-за логического добавления(ИЛИ), обработка завершится значением , эквивалентным true
, и если B
интерпретируется как false
, то обработка будет продолжена…
Попробуй это — A amp;amp; (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 amp;amp; B amp;amp; (B > A);
const r2 = A amp;amp; (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; }
Комментарии:
1. Упрощенное выражение не выполняется, когда A отрицательно, а B равно 0 или нулю, но, возможно, исходное выражение неверно, когда A или B равно 0 (я не знаю, был ли запрос игнорировать число 0 или только для нулей)
2. @ManuelRomeiro хорошо, я добавил дополнительные тесты. Я подумаю о том, как я могу это исправить
3. Это не одно и то же выражение A amp;amp; (B > A)
4. @Bernardao Я знаю, что уже обновил ответ, прочитайте, что я добавил