Не одинаковы логические выражения

205
29 января 2018, 07:26

Добрый день, хочу спросить, почему здесь в переменной 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
}

}

Answer 1

Все операторы выполняются строго по очереди. результат любого логического оператора, это логическое значение, true либо false. когда вы пишите a < b < c то сначала проверяется одно из условий, a < b, дает в результате например true. После этого происходит сравнение true < c ... А в случае a < b && b < c выполняется b < c, дает true, потом a < b дает, скажем то же true, и наконец выполняется true && true.

Answer 2

< и > - операции сравнения. Результат их выполнения - логическое значение (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.

Answer 3

Потому что,пример:

console.log(4 < 15 < 5);

В первом случае сравниваются два числа,результат true.Затем будут сравниваться два различных типа true и 5 ,а это численное преобразование и результат всего выражения будет неверным.Подробнее тут

Answer 4

( 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 в интервал.

READ ALSO
Запуск loader пока грузиться страница

Запуск loader пока грузиться страница

Здравствуйте, как сделать loader на сайте? Отправляется запрос через AJAX, далее пока грузит вывод, показываем loader, ну типа картинка загрузкиНе...

167
Внутреннее устройство массива

Внутреннее устройство массива

в функцию массив не копируется, а передается ссылка

148
Uncaught TypeError: Cannot set property &#39;drawSquare&#39; of undefined(Пишу змейку на js помогите пожалуйста)

Uncaught TypeError: Cannot set property 'drawSquare' of undefined(Пишу змейку на js помогите пожалуйста)

Помогите с ошибкой Uncaught TypeError: Cannot set property 'drawSquare' of undefined

201
Как сделать поиск mysql?

Как сделать поиск mysql?

У меня есть столбец 'region' В нем записаны: Москва, Санкт-Петербург, Омск, Сочи, Пермь

280