Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Объясните пожалуйста специфику конструкции (https://javascript.ru/forum/misc/57086-obyasnite-pozhalujjsta-specifiku-konstrukcii.html)

Aleks123 18.07.2015 23:15

Объясните пожалуйста специфику конструкции
 
Прошу помочь с пониманием следующего момента:

Необходимо чтобы появлялось окно prompt до тех пор пока не будет введен один из вариантов верного текста. Если будет только одно условие, то сработает корректно. Пример:
do {
	var a = prompt("Ввод текста");
} while (a != "текст");


Когда будет введен "текст" цикл закончит выполнение. Но необходимо несколько условий, пишу так:
do {
	var a = prompt("Ввод текста");
} while (a != "текст" || a != "текст2");


Цикл получается бесконечным. Опытным путем заменил оператор или на и:
do {
	var a = prompt("Ввод текста");
} while (a != "текст" && a != "текст2");


Начало срабатывать, но немогу понять почему?

Decode 18.07.2015 23:30

do {
    var a = prompt("Ввод текста");
} while (a != "текст" || a != "текст2");


Если в переменной a будет значение 'текст' — оператор ИЛИ "пойдет" направо и увидит там "текст2". Соответственно условие будет верным.

Aleks123 18.07.2015 23:33

Думал над этим около двух часов. Стоило зарегистрироваться и создать тему на форуме как понимание резко пришло, посмотрел на это немного под другим углом: while будет выполнять до тех пор пока выражение в скобках = true, а при или оно получается таковым всегда.

Да, спасибо, пока набирал свое сообщение вы уже ответили.

Makarov 19.07.2015 00:03

Aleks123,
это вообще замечательный способ) Как только у меня какая-то проблема с которой долго туплю, я открываю so и начинаю писать туда вопрос, большинство вопросов отпадают сразу или через 5 минут после того как кнопку "отправить" жмешь. Метод утенка называется.

kostyanet 19.07.2015 09:19

Не обязательно циклить, рекурсии должно хватить

function GuessText(p,a){
  if(a!="foo" && a!="bar" && a!="baz"){
    a=prompt(p||"Ввод текста",a||"");
    return GuessText("Введите правильный текст",a);
  }
  else
    return a;
}

var some=GuessText();
some;
/*
bar
*/


Часовой пояс GMT +3, время: 05:08.