Есть ли какое-то оправдание для `x ‹ y && y › x`?

Я просматривал некоторый код Javascript, используемый для проверки ввода формы, и я заметил оператор if, который читал if (!(x < y && y > x)) {...}

Моя первоначальная мысль заключалась в том, что такого рода тавтологическая конструкция совершенно излишня и что одно из двух сравнений следует опустить. На всякий случай, если есть шанс, что я ошибаюсь, и на самом деле это еще не все, я подумал, что спрошу.

Другая моя мысль заключалась в том, что это может быть случай какой-то идиомы, необходимой в другом языке, которую программист просто привнес с собой в Javascript по привычке (хотя я был бы удивлен, обнаружив язык, в котором что-то вроде этого требуется, который также используется в любой среде).

РЕДАКТИРОВАТЬ

Конкретный код находится в функции для проверки того, что даты начала и окончания для отправленного события возможны (т. е. дата окончания находится после даты начала). Фактический пример читается как if(!(start_time < end_time && end_time > start_time)) {...}, где start_time и end_time являются значениями DateTime.

РЕДАКТИРОВАТЬ 2

Не является дубликатом этот вопрос, так как в этом случае проблема заключается в необходимости проверить два условия, которые кажутся взаимоисключающими в операторе if, в то время как в этом случае проблема заключается в том, как разрешить оператор if, который, по-видимому, требует одновременного выполнения двух взаимоисключающих условий.


person 08915bfe02    schedule 07.08.2018    source источник
comment
Возможно быть не просто тавтологией, но маловероятно в разумной кодовой базе. Можете ли вы опубликовать больше кода, чтобы мы могли увидеть, что такое x и y?   -  person CertainPerformance    schedule 07.08.2018
comment
Да, пожалуйста. Опубликуйте еще код в контексте.   -  person UtkarshPramodGupta    schedule 07.08.2018
comment
не могу понять вашу проблему. однако ваш код никогда не будет выполнять это условие. это как == условие   -  person Negi Rox    schedule 07.08.2018
comment
@NegiRox Не обязательно. Это возможно.   -  person CertainPerformance    schedule 07.08.2018
comment
Если это даты, то я почти уверен, что такая проверка излишня.   -  person CertainPerformance    schedule 07.08.2018
comment
В такие моменты я просто исправлял код так, как считаю нужным, добавляя console.error, который печатает, если (x < y) !== (x < y && y > x). При выполнении ваших тестовых случаев вы увидите что-то в журналах, если ваши предположения неверны.   -  person Nisarg    schedule 07.08.2018
comment
@CertainPerformance это невозможно, братан. если значение не то же самое. этот код не будет выполняться   -  person Negi Rox    schedule 07.08.2018
comment
@NegiRox См. ссылку, опубликованную NisargShah. Возможно.   -  person CertainPerformance    schedule 07.08.2018
comment
@NisargShah У нас также есть некоторые действительно ненадежные правила принуждения, которые могут сыграть роль в этом .   -  person Olian04    schedule 07.08.2018
comment
Возможный дубликат Меньше и больше 10   -  person Stanislav Kralin    schedule 09.08.2018


Ответы (1)


Это похоже на шаблон, допускающий ложные значения, которые преобразуются в число (без NaN, например '' или null).

function f(x, y) {
    return [!(x > y && y < x), x <= y, x < y || x === y].join(' ');
}

console.log(f(1, 2));                 //  true
console.log(f(2, 1));                 // false
console.log(f(1, 1));                 //  true
console.log(f('', 1));                //  true
console.log(f(1, ''));                // false
console.log(f('', ''));               //  true
console.log(f(undefined, undefined)); //  true \
console.log(f(1, undefined));         //  true  different values by using other comparisons
console.log(f(undefined, 1));         //  true /
console.log(f(null, null));           //  true
console.log(f(1, null));              // false
console.log(f(null, 1));              //  true
.as-console-wrapper { max-height: 100% !important; top: 0; }

person Nina Scholz    schedule 07.08.2018