(Javascript)给定间隔内的素数:for循环不会迭代

(Javascript)给定间隔内的素数:for循环不会迭代,javascript,for-loop,if-statement,primes,Javascript,For Loop,If Statement,Primes,在下面的代码中,prime测试函数在prime时返回true,否则返回false。 我用它来打印5到20之间的素数 预期产量显然是5,7,11,13,17,19 for循环似乎没有迭代,只是停留在5。 输出就像脚本卡在无限while循环中一样 我不知道我做错了什么,也许if语句写得不对? 对javascript还是有点陌生 function is_prime(number){ if (number==2 || number==3){ return true; }

在下面的代码中,prime测试函数在prime时返回true,否则返回false。 我用它来打印5到20之间的素数

预期产量显然是5,7,11,13,17,19

for循环似乎没有迭代,只是停留在5。 输出就像脚本卡在无限while循环中一样

我不知道我做错了什么,也许if语句写得不对? 对javascript还是有点陌生

function is_prime(number){

    if (number==2 || number==3){
        return true;
    }
    
    if (number==0 || number==1 || number%2==0){
        return false;
    }

    if ((number+1)%6!=0 && (number-1)%6!=0){
        return false;
    }
    
    for(i=3; i-1<=parseInt(number)**.5; i+=2){

        if (number%i==0){
            return false;
        }
    }
    
    return true;
}


for(i=5;i<=20;i++){

    if(is_prime(i)){

        console.log(i)
    }
}

在for循环中创建了一个名为i的全局变量,然后在函数中更改该变量


在这两种情况下都使用let i。

在for循环中创建了一个名为i的全局变量,然后在函数中更改该变量

在这两种情况下都使用let i。

只需在for循环中添加let i=5,您需要声明i

for(let i=5;i<=20;i++){

    if(is_prime(i)){

        console.log(i)
    }
只需在for循环中添加let i=5,您需要声明i

for(let i=5;i<=20;i++){

    if(is_prime(i)){

        console.log(i)
    }

您没有声明变量i,因此JavaScript在全局范围内创建它。在您的函数中,您也没有声明它,因此它使用的是同一个变量,并且循环的执行并不像您期望的那样

使用let声明变量,以便它们不会发生冲突,如中所示

for (let i=5;...

请参见

您没有声明变量i,因此JavaScript在全局范围内创建它。在您的函数中,您也没有声明它,因此它使用的是同一个变量,并且循环的执行并不像您期望的那样

使用let声明变量,以便它们不会发生冲突,如中所示

for (let i=5;...

请参见,因为您在循环中创建了一个全局变量。用let声明变量,一切都会正常工作。
注意:使用严格模式将不允许您再次犯一些愚蠢的错误,因为您在循环中创建了一个全局变量。用let声明变量,一切都会正常工作。 注意:使用严格模式将不允许您再次犯一些愚蠢的错误

除了在for循环中使用初始值设定项之外,这只是一种很好的做法,通常建议您为不同的变量使用不同的名称,原因有很多:

它使变量用法不那么模棱两可 有助于防止您自己和代码的其他读者稍后混淆! 如果您只在一个地方使用i,那么调试就更容易了。如果您在i中获得了意外值,那么您就知道应该在哪里查找 例如,如果我在嵌套循环,或者在一个脚本中有多个循环,我通常会从I开始,然后沿着字母表j、k、l等进行操作

基本上,只要有助于跟踪数据,您使用的任何模式都可以

除了在for循环中使用初始值设定项(这是一种很好的做法)外,通常还建议对不同的变量使用不同的名称,原因有很多:

它使变量用法不那么模棱两可 有助于防止您自己和代码的其他读者稍后混淆! 如果您只在一个地方使用i,那么调试就更容易了。如果您在i中获得了意外值,那么您就知道应该在哪里查找 例如,如果我在嵌套循环,或者在一个脚本中有多个循环,我通常会从I开始,然后沿着字母表j、k、l等进行操作


基本上,只要有助于跟踪数据,您使用的任何模式都可以

始终调试您的值:console.logi会将您指向参考底图问题。这是您在不声明局部变量时遇到的问题。它们是全局的。请考虑:始终调试您的值:console.logi会将您指向参考底图问题。这是您在不声明局部变量时遇到的问题。它们是全局的。请考虑:这是一个非常好的答案的开始,但请明确指出OP提供的代码中您的意思。例如,您应该提到哪个变量是全局的,以及如何正确地对其进行编码。严格模式提示是一个很好的提示,如果在你面前措辞少一点:-这是一个非常好的答案的开始,但请准确地确定你在OP提供的代码中的意思。例如,你应该提到哪个变量是全局的,以及准确地如何正确编码它。如果你脸上的措辞少一点,严格模式提示是一个不错的提示:-