Рефакторинг A

#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 Я знаю, что уже обновил ответ, прочитайте, что я добавил