JavaScript IF 语句和 While 循环无法正常工作

时间:2020-12-25 16:22:25

标签: javascript if-statement while-loop password-generator

好的,现在我已经能够通过将 length 属性添加到 while 循环来解决 Length 问题。但是,当我生成 noSpecialCharacter() 时,它会在生成的密码前面给我 NaN。

这是函数:

const noSpecialCharacters = () => {
    let password;
    for (let i = 0; i < askUser; i++) {
        let result3 = characterSet[randomCharacter()];
        password += result3;
    }
    return password;
}

    let askUser;
// create a function for prompts
const prompts = () => {
    const minLength = 8;
    const maxLength = 128;
    askUser = null
    while (askUser === null || askUser.length < minLength || askUser.length > maxLength) {
        // ask the user again
        askUser = prompt('Enter a password character length. Character length must be at least 8 and between 128.');
        let confirmSpecialCharacter;
        // if password is between length range
        if (askUser >= minLength && askUser <= maxLength) {
            // ask for special characters
            confirmSpecialCharacter = confirm('Would you like for your password to include special characters?');
            // if yes, call combine random
            let pass = confirmSpecialCharacter === true ? combineRandom() : noSpecialCharacters();

            alert(pass);
        }

    }

    return askUser;

}

prompts();

3 个答案:

答案 0 :(得分:2)

检查长度时,使用 askUser.length 但是按照这个逻辑,当用户第一次输入正确时,wile 循环中的任何内容都不会运行。

更好的方法是初始化 askUser = null 并将 while 中的条件设置为:

while (askUser === null || askUser.length < minLength ||  askUser.length > maxLength)

首先检查 askUser 是否为空

let askUser;
    // create a function for prompts
    const prompts = () => {
        const minLength = 8;
        const maxLength = 128;
        askUser = null
        while (askUser === null || askUser.length < minLength ||    askUser.length > maxLength) {
            // ask the user again
            askUser = prompt('Enter a password character length. Character length must be at least 8 and between 128.');
            let confirmSpecialCharacter;
            // if password is between length range
            if (askUser.length >= minLength && askUser.length <= maxLength) {
                // ask for special characters
                confirmSpecialCharacter = confirm('Would you like for your password to include special characters?');
                // if yes, call combine random
                if (confirmSpecialCharacter === 'yes') {
                    let pass = combineRandom();
                    alert(pass);
                } else {
                    let pass = noSpecialCharacters();
                    alert(pass);
                }
    
            }
    
    
        }
    
        return askUser;
    
    }
    prompts()

答案 1 :(得分:1)

由于人们通过在 .length 中添加 askUser 解决了您的问题,我在这里建议您通过继续调用将代码从 while 循环重构为 recursive函数本身,直到它通过验证。 (代码未经测试)

使用此方法,您可以通过 return early 防止嵌套条件。

// create a function for prompts
const prompts = () => {
    const minLength = 8;
    const maxLength = 128;

    // ask the user
    let askUser = prompt('Enter a password character length. Character length must be at least 8 and between 128.');

    // keep asking the function itself until it passed the validation
    if (askUser.length <= minLength || askUser.length >= maxLength || askUser === null) {
        return prompts()
    }

    // ask for special characters
    let confirmSpecialCharacter = confirm('Would you like for your password to include special characters?');
    let pass;

    // if yes, call combine random
    if (confirmSpecialCharacter) {
        pass = combineRandom();
    } else {
        pass = noSpecialCharacters();
    }

    alert(pass);
    return askUser;
}

使用三元条件,您可以获得更短的代码。

// if yes, call combine random
let pass = confirmSpecialCharacter ? combineRandom() : noSpecialCharacters();

答案 2 :(得分:0)

在您的 while 条件下,您实际上并未检查 <div class="grid-container"> <div> <div>1</div> </div> <div> <div>2</div> </div> <div> <div>3</div> </div> <div> <div>4</div> </div> </div> 长度。将其更改为此行:askUser 它将起作用。