Как усовершенствовать такой JS-код (задача из learn.javascript.ru/logical-operators#tasks)
Задача про админа.
function HelloAdmin() {
let msgAdmin = 'Здравствуй, дорогой ' + login;
alert(msgAdmin);
}
let login;
let pass;
let proba = 1;
let probaSumm = 3;
while (proba <= probaSumm) {
login = prompt('Попытка ' + proba + '! Введи ЛОГИН:', 'admin');
if (login == 'admin') {
pass = prompt('Введите пароль: ', 123);
if (pass == 123) {
HelloAdmin();
break;
//alert ('Здравствуй, дорогой ' +login);
} else if (pass == null || pass == '') {
alert('На выход!');
break;
} else {
alert('Не верный пароль!');
}
} else if (login == null || login == '') {
alert('На выход!');
break;
} else {
alert('Я тебя не знаю!');
}
proba++;
}
if (proba >= probaSumm)
alert('Вы исчерпали все попытки. Ваш IP заблокировн!');
Новичок (уровень 0). Вопросы, которые мне в данный момент сложно решить:
1). как тут можно применять МЕТКИ и CONTINUE
2). как еще можно дать 3 (три) попытки кроме, как циклом while
3). как впихнуть массивы (связка: Логин и пароль), чтоб можно было входить не только из-под ADMIN, но и пару-тройкой других пользователей?
Ответы (1 шт):
В данном случае метки и
continueне очень подходят. Метки удобны, когда есть несколько вложенных циклов и нужно сразу из внутреннего, например, оборвать или продолжить внешний. Так как у вас один уровень цикла, ничего кроме искусственного усложнения тут, наверное, не придумать.continueже обычно нужен, если необходимо отказаться от какой-то завершающей части в теле цикла. Но у вас весь цикл распределён между чёткими условиями и вне условий ничего не происходит, поэтому и отменять нечего.Можно через цикл
for, как в примере ниже.В вашем случае удобнее использовать не массив, а объект (а ещё лучше
Map— когда вы до него доберётесь и изучите) — так естественнее хранить пары имя-пароль.
Ну и ещё пара советов:
Поскольку
promptвозвращает строки, привыкайте сразу строго сравнивать со строками, так вы избежите в будущем путаницы с типами. И вообще по возможности всегда используйте строгое сравнение (===и!==).Если есть возможность, не используйте глобальных переменных, лучше создавайте локальные и передавайте их в функции как аргументы (как в случае с
loginи функцией приветствия).Если вы не переприсваиваете значение переменной, лучше использовать
const, а неlet.Осторожно проверяйте граничные значения. Например, в цикле вы разрешаете до 3 попыток ВКЛЮЧИТЕЛЬНО, но в конечной проверке
if (proba >= probaSumm)выводите сообщение об ошибке, если попыток было ровно 3.Если мы моделируем ситуацию со авторизацией, лучше, наверное, не задавать по умолчанию реальные логин и пароль, а оставлять пустую строку.
Могу предложить такой вариант:
function HelloUser(login) {
const msgUser = 'Здравствуй, дорогой ' + login;
alert(msgUser);
}
const auth = {
admin: '123',
Alice: '345',
John: '789',
};
const attemptsLimit = 3;
let attempt;
for (attempt = 1; attempt <= attemptsLimit; attempt++) {
const login = prompt('Попытка ' + attempt + '! Введи ЛОГИН:', '');
if (auth[login] !== undefined) {
const pass = prompt('Введите пароль: ', '');
if (pass === auth[login]) {
HelloUser(login);
break;
} else if (pass === null || pass === '') {
alert('На выход!');
break;
} else {
alert('Не верный пароль!');
}
} else if (login === null || login === '') {
alert('На выход!');
break;
} else {
alert('Я тебя не знаю!');
}
}
if (attempt > attemptsLimit)
alert('Вы исчерпали все попытки. Ваш IP заблокирован!');