Почему при написании проверки 3>2>1 результат выдаёт false? при этом если написать 1<2<3, то получаю true
для того, что бы разобрать почему и как так получается, сперва нужно разобраться в какой последовательности происходят операции сравнения, есть два вариант:
- справа налево (сначала 2>1, а потом проверка результата на меньше 3)
- слева направо (сначала 3>2, а потом проверка больше ли результат 1)
Лично мне не удалось найти какой-то документации по этому поводу, поэтому я начал делать свои собственные проверки.
Для ситуации справа налево:
мы понимаем, что проверка 2>1
всегда возвращает true
, тогда следующая проверка выглядит таким образом:
3 > true
и она возвращает true , что не соответствует результату полученной проверки. Тут я подумал, что оператор сравнения мог повести себя как-то необычно, например данную проверку провести как проверку строк, то есть: '3' > 'true'
и данная проверка возвращает false (совпадает с полученным результатом проверки 3>2>1
), тогда для подкрепления этой теории я также проверил эту теорию на проверки 1<2<3
и результаты совпали:
тогда также должно было быть логичным, что если вместо 3 подставить какую-то строку (результат сравнения которой с 'true'
даст true
), то и в результате я должен тоже получить true, но не тут-то было:
на этом моё предположение было опровергнуто и идеи в направлении последовательности операции сравнения справа налево у меня закончились, поэтому я решил пройтись по варианту слева направо.
Если последовательность последовательность выполнения операций сравнения идёт слева направо, тогда при сравнении 3>2>1 после первого сравнения будет второе имеющее следующий вид:
true > 1 - оно возвращает false и тут можно сказать, что возможно при интерпретации true воспринимается как 1. Тогда логично, что 1 не больше 1, для проверки этого можно последнюю операцию сделать не >
, а >=
или же ==
и ожидать true в качестве результата:
Также будет логична и вторая проверка:
1<2<3
--> true < 3
--> 1 < 3
--> true
немного позже я сделал ещё несколько проверок с этим своим предположением и результаты проверок были правильны во всех случаях, поэтому я считаю, что операции сравнения в таких случаях выполняются слева на право, что также приводит к логическому пониманию почему был получено true
при сравнении 1<2<3
и false
при 3>2>1
Действительно, операторы > и < выполняются слева-направо и после того, как первое сравнение вернет TRUE, а справа окажется 1, выполнится неявное приведение TRUE к числовому типу Number (TRUE => 1) , в результате сравнение вернет FALSE.
В случае же 1<2<3 вернется TRUE, т.к. 1<3
Автору предыдущего ответа респект за проведение ряда опытов.
По поводу "не удалось найти" - Посмотрите здесь часть "Преобразование к типу Number"
Ну или тут
Google в помощь, господа
Не совсем по теме. А еще интересная штука получается если выполнить var a = b = 100; получится глобальная переменная b со значенеим 100, а уже потом будет идти присвоение этой 100 локальной переменной а.