JavaScript

Как работают операции "Или" (дизъюнкция), которые в коде пишутся как "||" "&&"?

Я только начал проходить курс по програмированию и столкнулся с небольшой проблемой.
Мне надо чтобы пользователь ввел ответ на мою загадку.
В значении "answer1" я написал несколько вариантов ответа: Елка, Ёлка и елка (см. фото).
Но почему то если пользователь введет один из правильных ответов: (Ёлка или елка) то он оказывается не верным. Верный только 1 вариант: (Елка с большой буквы)
Пожалуйста объясните почему так происходит. Возможно я не правильно использую эту операцию: " || ".
Romka Muslimanov
Romka Muslimanov
60
ну, это ж джаваскрипт, тут всё не по-людски.

короче, конструкция ("Елка" || "Ёлка" || "елка") вычисляется так:
берется первый операнд, "Елка", приводится к булевскому типу. если получилось True, то возвращается этот операнд. если нет, то берется второй операнд и т. п.
(https: // learn.javascript.ru/logical-ops)

то есть в данном случае ("Елка" || "Ёлка" || "елка") вернет "Елка"

имхо тут лучше сделать так:
var Answers = ["ёлка", "елка"];
if (Answers.indexOf(Загадка1.toLowerCase()) != -1) { /*успех*/ }
Эльмурат Садыкжанов
Эльмурат Садыкжанов
83 582
Лучший ответ
Артем Концов Я думаю вам будет интересен мой ответ на этот вопрос

Для таких задач придуманы регулярные вырождения и вот как они работают пример
<script>
if(/^(Елка|Ёлка|елка) $/.test(prompt("Известная певица ?","Тёлка"))){alert("И это правленый ответ!");}else{alert("Вы негодовали её заву Ёлка");}
</script>
Но лучше тогда так написать тогда у пользователя есть куча вариантов тут подаёт и Елка, Ёлка, елка, ёлка, ЁЛКА, ЕЛКА и даже такой вариант ЕлКа тоже будет считаться правильным!
<script>
if(/^(Елка|Ёлка) $/i.test(prompt("Известная певица ?","Тёлка"))){alert("И это правленый ответ!");}else{alert("Вы негодовали её заву Ёлка");}
</script>

АК
Артем Концов
84 066
>> Возможно я не правильно использую эту операцию: " || ".
Да, ее необходимо использовать при вычислении булевого результата, а не строкового:
answer1 = answer1.toLowerCase();
if ((answer1 === 'елка') || (answer1 === 'ёлка')) ...
_
Или, решение регуляркой - более разумный подход, ведь рег. выражения служат как раз таким целям, как валидация:
if(answer1.match(/^[её]л (?:оч)? ка$/i)) ...
(пробелы там не нужны - их добавляет парсер "Ответов")
Посмотреть работу регулярного выражения можно тут.
_
з. ы.: Избегайте
∙ кириллицы в именах переменных (и общепринятая нотация - lowerCamelCase, а не UpperCamelCase)
∙ нечеткого сравнения ==
∙ лишних блоков {}
Рекомендую более тщательно изучить JavaScript и стилистические рекомендации.
Евгений Crash
Евгений Crash
96 721
Евгений Crash *лишних блоков {}, и лишних, бессмысленных операторов if
// Не все правильно делаешь, просто надо правильно оформить код;
let a = prompt( 'Что зимой и летом одним цветом?', '' );
if( a === '' || a === null ) return;
else {
// Можно сделать массив с правильными ответами ([ 'Елка', 'Ёлка', 'елка' ]);
// Можно проверять ответ регулярным выражением ( /[ёе] лка/i );
if( a === 'Елка' || a === 'Ёлка' || a === 'елка' ) {
alert( 'Правильно!' );
}
else {
alert( 'Не правильно!' );
}
}