JS三元条件运算符使用疑问:为何两段代码返回结果不同?
代码差异解析与改进建议
两段代码的核心差异
第一段代码逻辑直接:遍历可能的因数,收集到数组后直接返回数组,所以调用divisors(15)时,会返回收集到的因数数组[3,5]。
第二段代码的问题出在三元运算符的错误使用:
return divisors ? divisors != [] : `${integer} is prime`
在JS里,数组属于对象类型,哪怕是空数组[],在布尔判断中也会被视为true。当divisors是[3,5]时,三元运算符的第一个条件divisors为true,所以会执行divisors != []的判断——而两个数组哪怕内容相同,引用地址不同就会返回true,最终函数就返回了这个判断结果true,而不是你想要的数组。
另外你这段代码还有两个小错误:
- 模板字符串用了单引号
',应该用反引号`,否则变量不会被解析 - 变量名拼错了:
interger应该是integer
实现目标逻辑的正确写法
要实现「数组非空返回数组,否则返回质数提示」,应该通过数组的length属性判断是否为空,这是最可靠的方式:
function divisors(integer) { let divisors = [] for (let i = 2; i <= Math.sqrt(integer); i++){ if (integer % i === 0){ divisors.push(i) // 避免重复添加平方数的情况,比如4的因数2,只加一次 if (i !== integer / i) { divisors.push(integer / i) } } } // 对数组排序,保持结果有序 divisors.sort((a,b) => a - b) return divisors.length > 0 ? divisors : `${integer} is prime` };
额外的优化建议
- 循环上限优化:原来的
i < integer/2可以改成i <= Math.sqrt(integer),因为如果一个数n有大于其平方根的因数,那对应的另一个因数必然小于平方根,这样能减少循环次数,提升效率。 - 边界情况处理:要考虑输入的
integer小于2的情况(比如0、1、负数),这类数既不是质数也没有除自身外的因数,可以提前判断返回提示。 - 数组排序:优化后的循环会添加成对的因数,比如15会先加3再加5,排序后结果更规整。
内容的提问来源于stack exchange,提问作者jimbybob1
相关产品推荐
相关产品推荐

