递归函数中for...of循环操作数组:日志顺序与赋值异常咨询
问题解答
疑问1:为何两个count日志先于第一个array[count]日志输出?
这是代码错误导致的执行流异常,并非同步代码的正常逻辑:
- 初始调用
nameStuff(记为调用A),先执行console.log('count', 0)输出第一个日志。 - 执行
array[0] = names[0]存入{name: 'tim'},本该立刻输出对应的array[count]日志,但后续代码进入for循环,触发了递归调用。 - 递归调用(记为调用B)执行时,先输出
console.log('count', 1),接着因传入的names参数是未定义的name变量,执行到if(names.length>0)时抛出TypeError。 - 错误未被捕获,调用B的执行暂时中断,执行流回到调用A,此时调用A才补执行之前未完成的
console.log('array[count]', array[0]),输出{name: 'tim'}。 - 后续调用A的
for循环找到匹配项并返回数组,调用B的错误被隐式处理,延迟执行了它的console.log('array[count]', array[1]),最终形成了你看到的异常输出顺序。
疑问2:第二个array[count]日志为何是undefined而非{name: 'bob'}?
核心原因是递归调用的参数错误:
- 代码中递归调用写的是
nameStuff({ names: name, ... }),但name是未定义的变量,导致递归调用的names值为undefined。 - 递归调用执行
array[count] = names[count]时,undefined[1]的结果就是undefined,所以输出的array[count]是undefined。 - 最终结果里的
{name: 'bob'},是for循环遍历到{name: 'bob'}时,直接执行array[1] = names[1](此时names是原数组,names[1]就是目标对象)后返回的结果,和递归调用无关。
代码修正建议
要解决这些问题,需修正两处关键错误:
const names = [{ name: 'tim' }, { name: 'bob' }, { name: 'john' }] const nameStuff = ({ names, targetName, array = [], count = 0 }) => { console.log('count', count) let matchFound = false array[count] = names[count] console.log('array[count]', array[count]) // 修正匹配逻辑:比较对象的name属性而非对象本身 if (array[array.length - 1].name === targetName) { matchFound = true return array } // 修正递归条件与参数,避免无限递归和错误传参 if (count < names.length - 1) { count++ return nameStuff({ names, targetName, array, count }) } return matchFound ? array : undefined } const result = nameStuff({ names, targetName: 'bob' }) console.log('result', result)
内容的提问来源于stack exchange,提问作者Kevmon
相关产品推荐
相关产品推荐

