Сравнение интервалов не бомбит в JS

Почему интервальное сравнение не является бомбой в JavaScript?

if (-1 < x < 1) {
  console.info('x: ', x)
}

Почему нам разрешено делать это без ошибок?

Также кажется, что:

  • -1 < x < 1 верно для x<=-1
  • 1 < x < 1 верно для x<=1
  • -1 < x < -1 всегда ложь
  • -2 < x < 2 всегда правда

В последних двух случаях кажется, что это просто сравнение двух концов выражений. Как оцениваются эти выражения?

Они оцениваются как (-1 < x) < 1, что эквивалентно (-1 < x) != true или !(-1 < x).

Bergi 15.11.2018 14:15

Что вам действительно нужно, так это -1 < x && x < 1

yunzen 15.11.2018 14:24

@HerrSerker Я знаю, как делать правильные сравнения, я просто спрашивал, как JS оценивает то, что на других языках называется интервальным сравнением.

Andrea Bergonzo 15.11.2018 14:59

Я знал это. Но было бы интересно другим людям, которые хотят знать, как это делается правильно.

yunzen 15.11.2018 15:34
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
151
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Поскольку JavaScript допускает неявное приведение типов, в данном случае от логического к числовому. Результатом -1 < x является логическое значение, которое затем неявно приводится к числу (истина = 1, ложь = 0) для части (result) < 1. Так:

  • Когда -1 < x ложно, вторая часть - это 0 < 1, что верно.

  • Когда -1 < x истинен, вторая часть - это 1 < 1, что ложно.

Это описано в алгоритме абстрактное реляционное сравнение в спецификации и различных операциях, с которыми он связан.

-1 < x < -1 is always false
-2 < x < 2 is always true

In the last 2 cases it seems it is just comparing the 2 ends of the expressions. How are those expressions evalued?

Использование x = -1 и x = 1:

  • Если x = -1, то -1 < x ложный, а остальное - 0 < -1, что неверно.
  • Если x = 1, то -1 < 1 истинно, а остальное - 1 < -1, что ложно.
  • Если x = -1, то -2 < -1 истинно, а остальное - 1 < -2, что ложно.
  • Если x = 1, то -2 < 1 истинно, а остальное - 1 < -2, что ложно.

Я думаю, что это происходит потому, что javascript неявно считает, что true имеет значение 1, а false - значение 0.

Когда вы делаете -1 < x < 1, на самом деле вы делаете (-1 < x) < 1 или true < 1, если x = 0, то есть false.

Однако, если x=-2, (-1 < x < -1) вернет true, поскольку false < 1 - это true. Надеюсь это поможет.

Подробнее об этом можно прочитать здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators

Причина в том, что JS интерпретирует ваше выражение.

if ((-1 < x) < 1) {
  console.info('x: ', x)
}

Пробуем использовать брекеты ...

Другие вопросы по теме