Javascript 模行为不稳定的If语句

Javascript 模行为不稳定的If语句,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我正在制作一个函数来创建一个从0到num的素数列表。我从2到num的整数列表开始,然后迭代从2到I

我正在制作一个函数来创建一个从0到
num
的素数列表。我从2到
num
的整数列表开始,然后迭代从2到
I
的每一个整数;如果在任何点
项%i==0
,则该项将从列表中删除。这很好:

函数getPrimes(num){ //获取从2到num的整数列表 让素数=[…数组(num+1).keys(); 素数=素数。拼接(2); 设lastNumber=primes[primes.length-1]; //让iterable运行它的循环 //对于素数中的每个数 for(让素数为){ //如果不是prime,请使用iterable删除 for(设i=2;i 但是,为了提高效率,当我尝试将每个数字的iterable设置为最多
Math.floor(num/2)
时,它以某种方式破坏了代码:

函数getPrimes(num){ //获取从2到num的整数列表 让素数=[…数组(num+1).keys(); 素数=素数。拼接(2); 设lastNumber=primes[primes.length-1]; //让iterable运行它的循环 //对于素数中的每个数 for(让素数为){ //如果不是prime,请使用iterable删除 for(设i=2;i
当我尝试时,
getPrimes(10)
给出了
[2,3,5]
。从0到10的素数列表中缺少7。为什么?我检查了,7模2、3和4分别返回1、1和3。那么为什么循环中从
素数中删除7的代码运行呢?这是我放在代码中的唯一位置,我想从数组中删除一个数字。

第一个issue是指在删除项目时循环,这会导致跳过某些项目。相反,向后循环,以便仅移动已检查的项目。其次,
num/2
应更改为
Math.sqrt(数字)
,因为这是在确定一个数字是素数之前需要检查的最大因子。使用此方法,无需将
2
添加回数组

函数getPrimes(num){ //获取从2到num的整数列表 让素数=[…数组(num+1).keys(); 素数=素数。拼接(2); 设lastNumber=primes[primes.length-1]; //让iterable运行它的循环 //对于素数中的每个数 对于(设i=primes.length-1;i>=0;i--){ 设数=素数[i]; //如果不是prime,请使用iterable删除
对于(设j=2;j*j如果在迭代过程中拼接数组,则可能会跳过元素和其他不可预测的行为。在这种情况下,向后迭代可以避免问题,即删除的元素永远不会影响数组中剩余的要遍历的项。此外,如果有索引,则可以避免线性indexOf
call@ggorlen是的!谢谢。