Логика работы условия и , или на javascript
не пойму что я делаю не так, не понимаю логику работы условия.
Мне нужно два сценария:
- оба числа больше 0.7
- хотя бы одно из двух чисел не больше 0.2
Пишу следующий код но он не отрабатывает как нужно, что я упускаю?
const randomNumber = Math.random(); // produces random number between 0 (including) and 1 (excluding)
const separateRandomNumber = Math.random();
const condition07 = 0.7;
const condition02 = 0.2;
if (randomNumber && separateRandomNumber > condition07) {
alert("scenario 1");
} else if (randomNumber || separateRandomNumber < condition02) {
alert("scenario2");
}
Ответы (2 шт):
const randomNumber = Math.random();
const separateRandomNumber = Math.random();
const condition07 = 0.7;
const condition02 = 0.2;
if (randomNumber > condition07 && separateRandomNumber > condition07) {
console.log("scenario 1", randomNumber, separateRandomNumber);
} else if (randomNumber < condition02 || separateRandomNumber < condition02) {
console.log("scenario 2", randomNumber, separateRandomNumber);
} else {
console.log("no scenario", randomNumber, separateRandomNumber);
}
Вы хотели объединить с помощью И две переменные (как если бы это были однородные члены предложения) и передать их оператору сравнения БОЛЬШЕ. Но выражения в языках программирования так не работают.
В первую очередь нужно понять, что логическое И в языках программирования не создаёт перечисление, как союз И в естественных языках, таких как русский или английский. Это Булев оператор. Он возвращает не список из поданных на вход операндов, а логическое значение true или false. Булевы операторы применяются только к логическим значениям. Если на вход булева оператора подаётся не логическое значение, то есть 2 варианта того, что произойдёт. Если язык программирования поддерживает неявное (автоматическое) приведение типов, то значение будет приведено к булеву типу по правилам, принятым в этом языке. Если язык не поддерживает неявное приведение типов, то будет ошибка.
Вот Ваше условие: if (randomNumber && separateRandomNumber > condition07). Как оно может быть разобрано интерпретатором Js? У оператора сравнения > приоритет выше, чем у оператора булевого И &&. Поэтому Js сначала вычислит результат выражения separateRandomNumber > condition07. Это будет true или false. А затем к этому результату и randomNumber будет применено логическое И (&&). Но randomNumber - это не переменная Булева типа, а число. Поскольку Js поддерживает неявное приведение типов, значение randomNumber будет неявно приведено к Булеву типу по правилу: 0 преобразуется в false, другие числа преобразуются в true. Таким образом, Js не выдаст ошибки, выражение будет вычислено. Но результат будет явно не тем, который Вам нужен)
Как составить условие правильно, Вам уже написали в ответе выше.