You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Javascript初学者问题:数组与函数中不同引用为何能得到正确结果

const todos = [{
    text: 'Eat breakfast',
    completed: true
  }, {
    text: 'Eat Lunch',
    completed: true
  },
  {
    text: 'Eat Dinner',
    completed: false
  }
]

const removeTodo = function(todos, todoText) {
  const index = todos.findIndex(function(todo) {
    return todo.text.toLowerCase() === todoText.toLowerCase()
  })

  if (index > -1) {
    todos.splice(index, 1)
  }
}

removeTodo(todos, 'Eat breakfast')
console.log(todos)

问题1解答

findIndex是JS数组内置的实例方法,你调用todos.findIndex()时,这个方法内部会自动遍历todos数组的每一项元素:

  • 每遍历到一个元素,就会把这个元素作为实参,传给你传入findIndex的回调函数的第一个形参
  • 你这里给形参命名为todo,所以todo拿到的就是当前遍历到的todos里的单个元素,自然可以直接访问todo.text。你说的“操作数组要带s的数组名”是手动写for循环的写法,用数组内置方法的时候,方法已经帮你把当前元素取出来了,不需要每次都写todos[下标].text,属于封装好的便利写法。
    你完全可以把形参改成任意名字,比如改成item,写成return item.text.toLowerCase() === todoText.toLowerCase(),运行效果完全一致。

问题2解答

这个todo是回调函数的形参,它本身确实是可以任意命名的,和外部的todos数组没有提前绑定的关系,两者的关联是findIndex方法内部完成的:

  1. 你调用todos.findIndex(回调函数)时,findIndex的执行上下文绑定的就是当前调用它的todos数组
  2. findIndex内部会循环遍历todos的每一项,每一轮循环都执行一次你传入的回调,并且把当前循环到的todos元素,作为实参传给回调的第一个形参(也就是你命名的todo)
  3. 定义这个参数的意义就是接收当前遍历到的单个元素,省去你自己写for循环、手动用下标获取todos[i]的冗余代码。

内容的提问来源于stack exchange,提问作者blueberry24

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 08:15:04