Краткое сравнение в JS и других языках - PullRequest
1 голос
/ 19 июня 2019

Мне было интересно, смогу ли я написать это

if ( (a > b) == (a > c) ) { ...

вместо этого

if ( (a > b) && (a > c) ) || ( (a < b) && (a < c) ) { ...

a, b и c - числа

Ответы [ 2 ]

4 голосов
/ 19 июня 2019

Вы можете написать это, но они не являются эквивалентными выражениями (попробуйте, чтобы все 3 переменные были одинаковыми).

2 голосов
/ 19 июня 2019

Да, вы можете.В JavaScript операторы сравнения приводят к логическим значениям, которые можно напрямую сравнивать с == / === и != / !==, в этих сравнениях нет преобразования.(Их также можно сравнить с > и <, например: true больше false. В этом случае происходит преобразование, они преобразуются в числа, true => 1&& false => 0.)

Ваш первый блок кода перейдет в блок if, если a > b и a > c, или если a <= b и a <= c.(Это не совсем то, что делает ваш второй блок, заметьте, поскольку Скотт Хантер указывает на .) Правильное сравнение будет следующим:

if ( (a > b) == (a > c) ) {

эквивалентно

if ( (a > b) && (a > c) ) || (a <= b) && (a <= c) ) {

Давайте проверим:

function check(a, b, c) {
    // Your first code block
    const r1 = (a > b) == (a > c);
    // Your second, which isn't _quite_ the same
    const r2 = ( (a > b) && (a > c) ) || ( (a < b) && (a < c) );
    // My second
    const r3 = ( (a > b) && (a > c) ) || ( (a <= b) && (a <= c) );
    console.log(a, b, c, "=>", r1, r2, r3);
}
check(1, 2, 3);
check(2, 1, 3);
check(3, 2, 1);
check(1, 1, 2);
check(2, 2, 1);
check(2, 1, 2);
check(1, 1, 1);
.as-console-wrapper {
    max-height: 100% !important;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...