Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Что не так с кодом?

Павел Чалов Ученик (77), на голосовании 1 год назад
В начале каждого сгенерированного пароля идёт undefined а потом уже сам пароль.
Это сам код:

 function generatePassword() {
let i = 0;
passwordsList.querySelectorAll("li").forEach(el => {
el.remove()
})
while(i != 10) {
const randomChoice = []
let password;
for(let input of inputs.querySelectorAll("input:checked")) {
randomChoice.push(input.id)
}
let a = 0
while(a != Number(rangeInput.value)) {
var choice = randomChoice[Math.floor(Math.random()*randomChoice.length)]
password += renderPasswordSymbol(choice)
a++;
}
const passwordTamplate = `
  • %password%
  • `
    const finalPassword = passwordTamplate.replace("%password%", password)
    passwordsList.insertAdjacentHTML("beforeend", finalPassword)

    i++;
    }
    }

    passwordLength.oninput = function() {
    rangeInput.value = passwordLength.value;
    }

    btnAdd.addEventListener("click", () => {
    if(inputs.querySelectorAll("input:checked").length === 0) {
    alert("Выберите один из пунктов.")
    return
    }
    if(Number(rangeInput.value) < 6 || Number(rangeInput.value) > 42) {
    alert("Длина пароля может быть от 6 да 42 символов.")
    return
    }
    else {
    generatePassword()
    }
    })
    Голосование за лучший ответ
    Евгений Губарев Мастер (1128) 1 год назад
    Попробуй присвоить password пустую строку
     let password = ""; 
    Professional Professional Мудрец (15955) 1 год назад
    Проблема в строке `password += renderPasswordSymbol(choice)`. Функция `renderPasswordSymbol()` возвращает значение типа `undefined`, если символ не выбран. Поэтому, если в `randomChoice` нет выбранных символов, то строка `password += renderPasswordSymbol(choice)` будет добавлять к `password` значение `undefined`.

    Чтобы исправить это, вы можете использовать оператор `||` для проверки значения `renderPasswordSymbol()`. Оператор `||` возвращает первое значение, которое не равно `undefined`, или второе значение, если первое значение равно `undefined`. В этом случае вы можете использовать оператор `||` следующим образом:

    ```
    password += renderPasswordSymbol(choice) || ""
    ```

    Это заставит строку `password` добавлять к `password` пустое значение, если `renderPasswordSymbol()` возвращает значение `undefined`.

    Вот исправленный код:

    ```
    function generatePassword() {
    let i = 0;
    passwordsList.querySelectorAll("li").forEach(el => {
    el.remove()
    })
    while(i != 10) {
    const randomChoice = []
    let password;
    for(let input of inputs.querySelectorAll("input:checked")) {
    randomChoice.push( input.id )
    }
    let a = 0
    while(a != Number(rangeInput.value)) {
    var choice = randomChoice[Math.floor(Math.random()*randomChoice.length)]
    password += renderPasswordSymbol(choice) || ""
    a++;
    }
    const passwordTamplate = `<li class="password__item">%password%</li>`
    const finalPassword = passwordTamplate.replace("%password%", password)
    passwordsList.insertAdjacentHTML("beforeend", finalPassword)

    i++;
    }
    }
    ```

    Теперь пароли должны генерироваться без значения `undefined` в начале.
    Похожие вопросы