Я играл в jsfiddle.net, и мне любопытно, почему это возвращает true?
if(0 < 5 < 3) {
alert("True");
}
Так же это:
if(0 < 5 < 2) {
alert("True");
}
Но это не так:
if(0 < 5 < 1) {
alert("True");
}
Это чудак когда-либо полезен?
javascript
compare
operators
boolean-logic
punkrockbuddyholly
источник
источник
Ответы:
Порядок операций заставляет
(0 < 5 < 3)
быть интерпретированным в javascript как((0 < 5) < 3)
производящий,(true < 3)
и true считается как 1, заставляя его возвращать true.Это также, почему
(0 < 5 < 1)
возвращает false,(0 < 5)
возвращает true, что интерпретируется как1
, в результате(1 < 1)
.источник
if(0 < 5 < 1) == false
. Теперь все ясно, спасибо :)((0 < 5) && (5 < 3))
, возможно, есть другие, но я не знаю их.Мое предположение, потому что
0 < 5
это правда, иtrue < 3
получает приведение к1 < 3
правде.источник
вероятно, потому что
true
предполагается, что1
такисточник
Потому что
true < 3
, потому чтоtrue == 1
источник
Что касается вашего вопроса, является ли эта причуда когда-либо полезной: я предполагаю, что мог бы быть случай, когда он был бы полезен (если вам нужен сжатый код), но полагаться на него (скорее всего) значительно снизит понятность вашего кода.
Это похоже на использование post / pre increment / decment как части больших выражений. Можете ли вы определить результат этого кода с первого взгляда?
Примечание: с помощью этого кода вы можете даже иногда получать разные результаты в зависимости от языка и компилятора.
Хорошая идея - сделать жизнь проще для себя и для следующего парня, который будет читать ваш код. Четко напишите, что вы на самом деле хотите, чтобы произошло, а не полагайтесь на побочные эффекты, такие как неявное преобразование логических значений.
источник
result
18?Ответ на вторую часть вопроса: "Этот причуды когда-нибудь полезны?" возможно, нет, как отмечалось в предыдущем ответе, если это действительно изюминка языка (Javascript), значение true приведено к 1, но в общем случае программист не использует 1 и true (и 0 и false) как то же самое.
Однако, если у вас есть ментальная модель 1, которая является истинной, а 0 - ложной, то это приводит к всевозможным хорошим логическим методам, которые являются чрезвычайно полезными, мощными и прямыми. Например, вы могли бы увеличить счетчик напрямую с результатом A> 100, что увеличило бы счетчик, если A больше 100. Этот метод можно рассматривать как причуду или уловку в Java, но в массиве или функциональном языке. может быть идиоматическим.
Классическим примером в APL на языке массива будет подсчет количества элементов в массиве, которые, скажем, больше 100:
Где, если A - массив из 5 элементов 107 22 256 110 3, то:
возвращает логический массив из 5 элементов:
1 0 1 1 0
и суммируем этот логический результат:
дает окончательный ответ:
3
Этот вопрос является прекрасным примером того, где этот метод был бы очень полезен, особенно если задача обобщена, чтобы определить, истинны ли n из m булевых значений.
Проверьте, верно ли хотя бы два из трех логических значений
источник
Это легко.
Начните с слева направо, чтобы оценить первые 0 <5. Это правда? Да. Так как TRUE = 1, он оценивает 1 <3. Поскольку 1 меньше 3, значит, это правда.
Теперь с этим
0 меньше 5? Да. Так что сделайте его ИСТИНА, что также означает 1. Теперь, имея в виду этот факт, оно оценивается как (1 <1). 1 меньше 1? Нет, поэтому это неверно. Это должно быть равным.
источник
это оценка 0 <5, которая вернула бы 1 для истины, когда 1 <3, который является истиной?
C # хочет позволить вам сделать это "Оператор" <'не может быть применен к операндам типа' bool 'и' int '"
источник
Я столкнулся с этим некоторое время назад в Obj-C и был очень озадачен этим. Я получил желаемые результаты, сделав что-то вроде этого:
Что, конечно, является ложным, так что вы не получите это «истинное» предупреждение. Рад, что прочитал это, теперь я знаю почему.
источник
В дополнение к python, CoffeeScript является еще одним языком, который поддерживает цепные сравнения, поэтому
3 < x < 10
будет преобразован(3 < x && x < 10)
в vanilla JS.источник
источник
Булевский операнд при работе над математическим оператором возвращает число. чтобы проверить это мы делаем
Таким образом
0 < 5
, возвращенное логическое значение (true), работающее с математическим оператором (<), вернет число. Таким образом, это сводится к 1 <3, который возвращаетtrue
источник
потому что 0 меньше 5, то это возвращает true, и по умолчанию true - все, что включает, и может быть оценено как 1, которое все еще меньше 3, что снова возвращает true
источник
попробуйте сформулировать свои результаты как число ()
или попробуйте это:
Я гуглил это, потому что я получал,
(3 >= 20) //returning true
и я думаю, что javascript пытался проверить3
как логическое значение, потому что я получал это значение изelm.getAttribute();
функции, котораяconsole.log();
печатала в виде строки.источник