Добрый день, хочу спросить, почему здесь в переменной if_2 выражения
( this.x1 < point.x && point.x < this.x2 )
и
( this.x1 < point.x < this.x2 )
не являются одинаковыми? Я хотел поменять для красоты кода на второе выражение, а проверка этой задачи отображает, что неверно, но ведь должно быть одинаковым? Тоже самое и со вторым выражением, там хотел поэкспериментировать и сделал вместо
( this.x2 < point.x < this.x1 )
это:
( this.x2 < point.x && point.x < this.x1 )
и выводило, что неверно.
Можете объяснить разницу, пожалуйста, потому что я делал тесты и видел, что это работает одинаково.
// first IF-statement: (x-x1)/(x2-x1)=(y-y1)/(y2-y1);
// second IF-statement: x1 < x < x2 || x2 < x < x1;
class Segment
{
constructor(p1, p2)
{
this.x1 = p1.x;
this.y1 = p1.y;
this.x2 = p2.x;
this.y2 = p2.y;
}
contains(point)
{
let if_1 = (point.x - this.x1) / (this.x2 - this.x1) == (point.y - this.y1) / (this.y2 - this.y1);
let if_2 = this.x1 < point.x && point.x < this.x2 || this.x2 < point.x < this.x1;
return if_1 && if_2
}
}
Все операторы выполняются строго по очереди. результат любого логического оператора, это логическое значение, true либо false. когда вы пишите a < b < c то сначала проверяется одно из условий, a < b, дает в результате например true. После этого происходит сравнение true < c ... А в случае a < b && b < c выполняется b < c, дает true, потом a < b дает, скажем то же true, и наконец выполняется true && true.
< и > - операции сравнения. Результат их выполнения - логическое значение (boolean). Как point.x < this.x2 затем сравнить с this.x1 (числом)?
В данном примере
( this.x1 < point.x && point.x < this.x2 )
сначала вычисляется выражение this.x1 < point.x. Если будет false, то дальше вычисление прекратится и все выражение ( this.x1 < point.x && point.x < this.x2 ) вернет false.
Если после this.x1 < point.x будет true , то вычисляется правый операнд point.x < this.x2. Если true после него, то true && true будет true.
Потому что,пример:
console.log(4 < 15 < 5);
В первом случае сравниваются два числа,результат true.Затем будут сравниваться два различных типа true и 5 ,а это численное преобразование и результат всего выражения будет неверным.Подробнее тут
( this.x1 < point.x && point.x < this.x2 ) Это выражение означает, что point.x находится в интервале от x1 до x2. Вы думаете, что ( this.x1 < point.x < this.x2 ) -это тоже интервал. Но это не совсем так. JS выполняет операторы сравнения по порядку. То есть сначала будет выполнено сравнение this.x1 < point.x. Его результат - логический. То есть это правда или ложь - true или false. И потом будет выполнена проверка такого вида: true|false < this.x2. True и false для арифметических операций приводятся к 1 и 0 соответственно. Не совсем то, что ожидаешь получить, когда пишешь проверку попадания x в интервал.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости