为什么JavaScript中把三目运算符替换为if/else后斐波那契代码无法运行?
问题原因与解决方案
- 核心语法差异:你遇到的报错本质是混淆了JS中
表达式和语句的区别:(i <= 1) ? i : arr[i-2] + arr[i-1]是三元表达式,执行后会直接返回对应分支的计算结果,所以可以直接作为arr.push()的参数传入。而if/else是流程控制语句,本身没有返回值,不能直接放在函数调用的参数位置,这属于语法错误,JS引擎解析时会直接抛出异常。 - 正确的if/else改写方式:如果要替换三元写法,需要先通过if/else计算出要插入数组的值,再调用
arr.push传入该值,正确可运行的改写代码如下:
function fib(n) { return new Array(n).fill(1).reduce((arr, _, i) => { // 先声明变量存储要push的值 let insertValue if (i <= 1) { insertValue = i } else { insertValue = arr[i - 2] + arr[i - 1] } arr.push(insertValue) return arr }, []); } console.log(fib(10))
- 逻辑验证:上述改写后的代码和原始三元写法逻辑完全等价,运行
fib(10)会输出标准的10项斐波那契数列结果:[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]。
内容的提问来源于stack exchange,提问作者Matheus Soares
相关产品推荐
相关产品推荐

