本文深入解析 javascript 三元运算符的语法结构、常见误用(如将数组本身当作布尔条件、错误比较空数组),并给出判断非空数组并分支返回的正确写法。
本文深入解析 javascript 三元运算符的语法结构、常见误用(如将数组本身当作布尔条件、错误比较空数组),并给出判断非空数组并分支返回的正确写法。
在 JavaScript 中,三元运算符 condition ? exprIfTrue : exprIfFalse 是一个简洁的条件表达式,但它不是 if-else 的语法糖替代,而是一个有明确求值顺序和类型语义的表达式:它首先求值 condition(强制转换为布尔值),再根据真假决定执行哪一侧表达式。
你第一段代码正确返回 [3,5],是因为逻辑清晰:遍历 2 到 integer/2(注意此处边界应为 i <= integer/2 或 i <= Math.sqrt(integer) 更严谨,但对 15 无影响),收集所有能整除的因数,最终返回数组。
问题出在第二段代码:
return divisors ? divisors != [] : `test${interger} is prime`;
这里存在三个关键错误:
立即学习“Java免费学习笔记(深入)”;
条件误判:divisors 是一个数组引用,而所有对象(包括空数组)在布尔上下文中均为 true。因此 divisors ? ... : ... 永远走 true 分支,根本不会进入 'test... is prime'。
错误的空数组检测:divisors != [] 并非判断“是否为空数组”。因为 [] !== [](两个新数组引用永远不相等),所以 divisors != [] 实际等价于 true(除非 divisors 恰好是字面量 [],但此处它是 let divisors = [] 创建的新引用)。正确方式是检查 divisors.length === 0 或 divisors.length(利用 0 为 falsy)。
模板字符串语法错误:使用了单引号 ' 而非反引号 `,且变量名拼写错误(interger → integer)。
✅ 正确写法如下:
function divisors(integer) { const divisors = []; // 修正循环边界:i <= integer / 2(或更优:i <= Math.floor(Math.sqrt(integer))) for (let i = 2; i <= integer / 2; i++) { if (integer % i === 0) { divisors.push(i); } } // 正确使用三元运算符:以 length 为条件,反引号包裹模板字符串 return divisors.length ? divisors : `${integer} is prime`;}console.log(divisors(15)); // [3, 5]console.log(divisors(13)); // "13 is prime"
? 额外建议:
掌握三元运算符的核心,是牢记其三段式结构与布尔转换规则;而数组判空,始终依赖 .length 属性——这是 JavaScript 中最安全、最语义清晰的方式。