Как усовершенствовать такой 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 шт):

Автор решения: vsemozhebuty
  1. В данном случае метки и continue не очень подходят. Метки удобны, когда есть несколько вложенных циклов и нужно сразу из внутреннего, например, оборвать или продолжить внешний. Так как у вас один уровень цикла, ничего кроме искусственного усложнения тут, наверное, не придумать. continue же обычно нужен, если необходимо отказаться от какой-то завершающей части в теле цикла. Но у вас весь цикл распределён между чёткими условиями и вне условий ничего не происходит, поэтому и отменять нечего.

  2. Можно через цикл for, как в примере ниже.

  3. В вашем случае удобнее использовать не массив, а объект (а ещё лучше 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 заблокирован!');

→ Ссылка