2012-02-16 2 views
3

Я уверен, что следующий ведет себя неправильно (по крайней мере, на мой взгляд) из-за какой-то truthiness сумасшествия:Строгий Значение сравнения (меньше/больше)

var x = 5; 
0 < x < 10 // True, and returns true. 
0 < x < 2 // False, and returns true. 
0 < x < 0 // False, and returns false. 

Как я понять это, (0 < 5) оценивает значение true, и (true < 2) также оценивается как истинный (то есть, 1 < 2). Я проверил это с третьим утверждением, которое, похоже, подтверждает мою теорию. Теперь на вопрос: есть ли способ сделать эту «работу» без большого количества дополнительного кода?

+0

Если вы используете это в условном выражении, почему бы не использовать '0

+1

Три человека менее чем за минуту ... ну, я думаю, я могу смело награждать себя «немым вопросом». – Casey

+0

как я не говорю, используйте &&, чтобы объединить сравнения, а не цеплять их так. Второй возвращает true, потому что 5> 0 оценивается как true, а затем через javascript funkiness, который позволяет сравнивать логическое и числовое значение true <2, и, следовательно, вся вещь возвращает true. – ameer

ответ

10

«... есть ли способ сделать эту« работу »без большого количества дополнительного кода?»

Конечно, использовать && ...

(0 < x) && (x < 10) 

Вы можете оставить круглые скобки, если вы хотите.

1

Как вы заметили, большинство языков программирования не будут реализовывать «между», как это было бы математически. Вместо этого разделите сравнения на два, где каждый раз сравниваются только два элемента.

var x = 5; 
0 < x && x < 10 
0 < x && x < 2 
0 < x && x < 2 

Итак, первая строка гласит, что «ноль меньше x и x меньше десяти». Если вы не уверены в том, в каком порядке будет оцениваться выражение, он будет работать как группировка.

(0 < x) && (x < 10) 
1

Проблема проистекает из того факта, что < является бинарным оператором.

Это означает, что один из < оценивается одновременно, а не оба.

Это означает, что независимо от порядка, в котором они оцениваются (что, IIRC - от L до R), одно из сравнений будет неправильным.

Потому что это КОД.

НЕ АЛГЕБР.

В противном случае, умное использование оператора , как обсуждается в других ответах, поможет вам в краткой работе по вашей проблеме.

+1

Фактически, он слева направо. На самом деле, я сказал так: | но спасибо за то, что интернет кричал на меня. – Casey

Смежные вопросы