Почему (0 <5 <3) возвращает true?

Я играл в jsfiddle.net, и мне любопытно, почему это возвращает true?

if(0 < 5 < 3) {
    alert("True");
}

Так делает это:

if(0 < 5 < 2) {
    alert("True");
}

Но это не так:

if(0 < 5 < 1) {
    alert("True");
}

Является ли эта причуда полезной?

Ответ 1

Порядок операций заставляет (0 < 5 < 3) интерпретироваться в javascript как ((0 < 5) < 3), который производит (true < 3), а true считается равным 1, заставляя его возвращать true.

Это также означает, что (0 < 5 < 1) возвращает false, (0 < 5) возвращает значение true, которое интерпретируется как 1, что приводит к (1 < 1).

Ответ 2

Мое предположение состоит в том, что 0 < 5 истинно, а true < 3 получает значение 1 < 3, которое истинно.

Ответ 3

возможно, потому что true считается 1, поэтому

0 < 5 < 3  -->  true < 3 -->  1 < 3  --> true

Ответ 4

Потому что true < 3, потому что true == 1

Ответ 5

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

Это похоже на использование post/pre increment/decment как части более крупных выражений. Можете ли вы определить, что такое результат кода с первого взгляда?

int x = 5;
int result = ++x + x++ + --x;

Примечание: с помощью этого кода вы иногда можете получать разные результаты в зависимости от языка и компилятора.

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

Ответ 6

Ответ на вторую часть вопроса: "Это причуда когда-нибудь полезная?" возможно, нет, как отмечено в предыдущем ответе, если это действительно причуда языка (Javascript), что true передается в 1, но что программист не имеет общего представления 1 и true (и 0 и false), как то же самое.

Если, однако, у вас есть ментальная модель 1, являющаяся истинным, а 0 - ложной, то это приводит ко всем видам хороших булевых методов, которые чрезвычайно полезны, мощны и прямолинейны. Например, вы можете увеличить счетчик напрямую с результатом A > 100, что увеличит счетчик, если A больше 100. Этот метод можно рассматривать как причуду или трюк в Java, но в массиве или функциональном языке может быть идиоматичным.

Классическим примером в языке массива APL было бы подсчет количества элементов в массиве, которые (скажем) больше 100:

+/A>100

Где, если A - это 5-элементный массив 107 22 256 110 3, то:

A>100

возвращает 5-элементный логический массив:

1 0 1 1 0

и суммируя этот логический результат:

+/1 0 1 1 0

дает окончательный ответ:

3

Этот вопрос является прекрасным примером того, где этот метод будет очень полезен, особенно если проблема обобщается, чтобы определить, истинны ли n из m логических значений.

Проверьте, не верны ли по крайней мере два из трех логических значений

Ответ 7

Это легко.

(0 < 5 < 3)

Начните с слева направо, чтобы он оценил первый 0 < 5. Верно ли это? Да. Поскольку TRUE = 1, он оценивает 1 < 3. Поскольку 1 меньше 3, так что это правда.

Теперь с этим

 (0 < 5 < 1)

0 меньше 5? Да. Поэтому сделайте его ИСТИННЫМ, что также означает 1. Теперь, имея в виду этот факт, он оценивает (1 < 1). Является ли 1 менее 1? Нет, поэтому он ложный. Он должен быть равным.

Ответ 8

выполняется ли оценка 0 < 5, которая возвращает 1 для истины, когда 1 < 3, которое истинно?

С# хочу, чтобы вы сделали это "Operator" < не может применяться к операндам типа "bool" и "int"

Ответ 9

Я столкнулся с этим немного назад в Obj-C и был очень озадачен этим. Я получил результаты, которые я хотел сделать, например:

if(0 < 5  && 5 < 3) {
alert("True");}

Что, конечно, неверно, поэтому вы не получите этого "истинного" предупреждения. Рад, что я это прочитал, теперь я знаю, почему.

Ответ 10

В дополнение к python CoffeeScript - это еще один язык, поддерживающий скоординированные сравнения, поэтому 3 < x < 10 будет преобразован в (3 < x && x < 10) в vanilla JS

Ответ 11

0 < 5 < 3 
==> ( ( 0 < 5 ) < 3 )
==> true < 3
==> 1 < 3
==> true

Ответ 12

Логический операнд при работе над математическим оператором возвращает число. чтобы проверить это, мы делаем

true + 1  which gives you 2.

Итак, 0 < 5, возвращаемое логическое (истинное), которое работает с математическим оператором (<), вернет число. Таким образом, он кипит до 1 < 3, который возвращает true

Ответ 13

потому что 0 меньше 5, то это возвращает true, и по умолчанию true - все, что включает, и может быть оценено как 1, которое все еще меньше 3, что снова возвращает true

Ответ 14

попробуйте сформулировать свои результаты как число()

if(Number(0) < Number(5) < Number(3)) {
    alert("True");
}

или попробуйте это:

if(Number(0) < Number(5) && Number(5) < Number(3)) {
    alert("True");
}

Я погуглил это, потому что я получал (3 >= 20) //returning true, и я предполагаю, что javascript пытался проверить 3 как логическое значение, потому что я получал это значение из функции elm.getAttribute();, которую console.log(); печатал в строковой форме.