JS Почему проверка 3>2>1 возвращает false?


#1

Почему при написании проверки 3>2>1 результат выдаёт false? при этом если написать 1<2<3, то получаю true


#2

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

  • справа налево (сначала 2>1, а потом проверка результата на меньше 3)
  • слева направо (сначала 3>2, а потом проверка больше ли результат 1)

Лично мне не удалось найти какой-то документации по этому поводу, поэтому я начал делать свои собственные проверки.

Для ситуации справа налево:

мы понимаем, что проверка2>1 всегда возвращает true, тогда следующая проверка выглядит таким образом:
3 > true и она возвращает true , что не соответствует результату полученной проверки. Тут я подумал, что оператор сравнения мог повести себя как-то необычно, например данную проверку провести как проверку строк, то есть:'3' > 'true' и данная проверка возвращает false (совпадает с полученным результатом проверки 3>2>1), тогда для подкрепления этой теории я также проверил эту теорию на проверки 1<2<3 и результаты совпали:

image

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

image

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

Если последовательность последовательность выполнения операций сравнения идёт слева направо, тогда при сравнении 3>2>1 после первого сравнения будет второе имеющее следующий вид:
true > 1 - оно возвращает false и тут можно сказать, что возможно при интерпретации true воспринимается как 1. Тогда логично, что 1 не больше 1, для проверки этого можно последнюю операцию сделать не >, а >= или же == и ожидать true в качестве результата:

image

Также будет логична и вторая проверка:
1<2<3 --> true < 3 --> 1 < 3 --> true

немного позже я сделал ещё несколько проверок с этим своим предположением и результаты проверок были правильны во всех случаях, поэтому я считаю, что операции сравнения в таких случаях выполняются слева на право, что также приводит к логическому пониманию почему был получено true при сравнении 1<2<3 и false при 3>2>1


#3

Действительно, операторы > и < выполняются слева-направо и после того, как первое сравнение вернет TRUE, а справа окажется 1, выполнится неявное приведение TRUE к числовому типу Number (TRUE => 1) , в результате сравнение вернет FALSE.
В случае же 1<2<3 вернется TRUE, т.к. 1<3 :slight_smile:
Автору предыдущего ответа респект за проведение ряда опытов.
По поводу "не удалось найти" - Посмотрите здесь часть "Преобразование к типу Number"
Ну или тут
Google в помощь, господа :slight_smile:


#4

Не совсем по теме. А еще интересная штука получается если выполнить var a = b = 100; получится глобальная переменная b со значенеим 100, а уже потом будет идти присвоение этой 100 локальной переменной а.