Почему (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();
печатал в строковой форме.