JavaScript中三元表达式短路与if语句短路的差异疑问
为什么你的三元运算符没起到短路返回的作用?
三元运算符只是表达式,不会自动中断函数
你写的那行arrOne.length !== arrTwo.length ? false : {}只是计算出了一个值(长度不匹配时是false,匹配时是空对象),但这个值完全没被处理——既没有用return返回,也没赋值给任何变量。函数会直接忽略这个表达式,继续执行后面的逻辑。而你用的if语句里明确写了return false,这才是让函数直接终止并返回结果的关键。三元运算符的“隐式返回”不是函数的返回
你误以为的“隐式返回”,只是指三元表达式自身会生成一个值,但这个值不会自动变成函数的返回值——除非你明确用return把它传递出去。之前的代码里,三元表达式的结果被直接丢弃,所以完全起不到任何作用。要实现相同短路效果,要么结合return,要么直接用if
如果非要用三元运算符实现类似逻辑,必须把return和它结合,但这种写法反而不如if直观:// 条件成立时return false,不成立则继续执行后续代码 if (arrOne.length !== arrTwo.length) return false; // 非要用三元的写法(不推荐,可读性差) arrOne.length !== arrTwo.length && (() => { console.log(false); return false; })();显然,直接用
if语句处理“条件满足就中断,不满足就继续”的场景,可读性和维护性都更好。
补充完整逻辑后的修正代码
function same(arrOne, arrTwo) { if (arrOne.length !== arrTwo.length) { console.log(false); return false; } let result = {}; // 统计数组元素出现频率 arrOne.forEach((i) => { result[i] ? result[i]++ : (result[i] = 1); }); // 检查平方值的频率是否匹配 for (let num of arrTwo) { let root = Math.sqrt(num); if (!result[root]) { console.log(false); return false; } result[root]--; } console.log(true); return true; } same([1, 2, 3, 4], [4, 1, 9]) // 长度不匹配,返回false same([1,2,3], [1,9]) // false same([1,2,1], [4,4,1]) // false
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

