JavaScript递归函数返回值类型转换解决push方法无法识别问题
你这段代码报错的核心原因和类型转换无关,问题出在Array.push()方法的返回值逻辑上:push()执行后返回的是数组更新后的长度,不是修改后的数组本身。
错误复现逻辑
以调用countdown(2)为例:
- 执行
countdown(2),n>0,先执行countdown(1) - 执行
countdown(1),n>0,先执行countdown(0) - 执行
countdown(0),返回空数组[] - 回到
countdown(1)的逻辑:空数组调用push(1)返回数字1(数组新长度),因此countdown(1)最终返回数字1 - 回到
countdown(2)的逻辑:拿到countdown(1)返回的数字1,对数字调用push()方法,自然触发“方法不存在”的报错。
修复方案
你不需要做任何类型转换,只要调整返回值逻辑,保证每次返回的都是数组即可,下面是3种常见实现:
- 先存递归返回的数组,push后再返回
function countdown(n){ if(n <= 0) return [] const arr = countdown(n - 1) arr.push(n) return arr }
- 用返回新数组的
concat()方法替代push,直接简写
function countdown(n){ return n <= 0 ? [] : countdown(n - 1).concat(n) }
- 用扩展运算符实现更简洁的写法
function countdown(n){ return n <= 0 ? [] : [...countdown(n - 1), n] }
关于你提到的类型转换问题
JavaScript是动态类型语言,不存在能“让运行环境强行识别push方法”的类型转换方案,你遇到的报错本质是递归返回值本身就不是数组,就算强行把非数组类型转为数组,得到的也不是你预期的倒序计数结果,无需在类型转换方向上浪费时间。
内容的提问来源于stack exchange,提问作者Bronx Branx
相关产品推荐
相关产品推荐

