Добрый день, хочу спросить, почему здесь в переменной 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 в интервал.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Здравствуйте, как сделать loader на сайте? Отправляется запрос через AJAX, далее пока грузит вывод, показываем loader, ну типа картинка загрузкиНе...
Помогите с ошибкой Uncaught TypeError: Cannot set property 'drawSquare' of undefined
У меня есть столбец 'region' В нем записаны: Москва, Санкт-Петербург, Омск, Сочи, Пермь