You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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`
};

额外的优化建议

  1. 循环上限优化:原来的i < integer/2可以改成i <= Math.sqrt(integer),因为如果一个数n有大于其平方根的因数,那对应的另一个因数必然小于平方根,这样能减少循环次数,提升效率。
  2. 边界情况处理:要考虑输入的integer小于2的情况(比如0、1、负数),这类数既不是质数也没有除自身外的因数,可以提前判断返回提示。
  3. 数组排序:优化后的循环会添加成对的因数,比如15会先加3再加5,排序后结果更规整。

内容的提问来源于stack exchange,提问作者jimbybob1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:30:14