请评审这段JavaScript质数检测代码是否存在问题?
代码评审意见
先看你提供的代码:
const input = 3; let isPrime = true; outer: for(let i = 2; i < input; i++){ for(let j = 2; j < input; j++) { if((i * j) === input) { isPrime = false; console.log(`${input} is Not a prime number`); break outer; } } } if(isPrime) { console.log(`${input} is a prime number`); }
核心问题点
- 冗余的双重循环:判断质数根本不需要嵌套两层循环。质数的定义是只能被1和自身整除,所以只需要检查从2到
Math.sqrt(input)之间的数是否能整除input就足够了——如果input有一个大于√input的因数,那必然对应一个小于√input的因数,完全没必要遍历所有数对。你的写法会做大量无意义的计算,比如input=11时,i和j都要循环到10,纯浪费性能。 outer标签的滥用:标签语句会让代码的控制流变得不直观,可读性差。其实完全可以通过提前return(如果封装成函数)或者设置isPrime后直接break并退出循环来替代,没必要用标签跳出多层循环。- 逻辑冗余:找到因数后已经输出了结果并终止循环,后续的
if(isPrime)判断其实可以简化,甚至不需要维护isPrime变量——只要循环结束后没找到因数,直接输出是质数就行。 - 复用性差:input被写死成3,没法复用这个逻辑判断其他数是否为质数,应该封装成函数。
优化后的示例代码
基础优化版(解决核心逻辑问题)
function checkPrime(num) { // 处理边界情况:小于2的数不是质数 if (num <= 1) { console.log(`${num} is Not a prime number`); return; } // 只需要循环到平方根 for (let i = 2; i <= Math.sqrt(num); i++) { if (num % i === 0) { console.log(`${num} is Not a prime number`); return; } } console.log(`${num} is a prime number`); } checkPrime(3); checkPrime(12); checkPrime(17);
更高效的版本(跳过偶数,减少循环次数)
function checkPrime(num) { if (num <= 1) { console.log(`${num} is Not a prime number`); return; } // 2是唯一的偶质数 if (num === 2) { console.log(`${num} is a prime number`); return; } // 偶数直接排除 if (num % 2 === 0) { console.log(`${num} is Not a prime number`); return; } // 只检查奇数,循环到平方根 for (let i = 3; i <= Math.sqrt(num); i += 2) { if (num % i === 0) { console.log(`${num} is Not a prime number`); return; } } console.log(`${num} is a prime number`); }
总结
你的思路本质是通过枚举数对乘积来判断是否有因数,虽然逻辑上能跑,但完全不符合质数判断的最优逻辑。上面的优化版本既提升了性能,又让代码更简洁易读,同时具备复用性。
内容的提问来源于stack exchange,提问作者user18457520
相关产品推荐
相关产品推荐

