JavaScript函数内如何引用数组名并修改外部原数组变量?
根本原因
JavaScript的函数参数始终是按值传递的:当你把外部数组incomeArray作为实参传入函数时,形参array只是拿到了原数组引用的一个副本,你在函数内给array重新赋值,只会改动函数内部的这个局部副本,完全不会影响外部作用域的incomeArray变量,所以最后一行的赋值逻辑不会生效。
可行实现方案
方案1:返回新数组外部接收(推荐)
这是JS生态里最通用的无副作用写法,适配绝大多数前端框架的状态更新逻辑:const removeObjectFromArray = (id, array) => { return array.filter(item => item.id !== id); } // 调用时手动覆盖原变量即可 incomeArray = removeObjectFromArray(deleteTargetId, incomeArray);方案2:原地修改原数组(副作用强,非必要不使用)
如果必须在函数内部完成对原数组的改动,不要给形参重新赋值,直接操作原数组的内容:const removeObjectFromArray = (id, array) => { const remainItems = array.filter(item => item.id !== id); // 清空原数组所有元素 array.length = 0; // 将保留的元素重新填入原数组 array.push(...remainItems); } // 调用后原数组直接被修改,无需重新赋值 removeObjectFromArray(deleteTargetId, incomeArray);警告:该写法会直接变更传入的数组,如果你代码其他位置持有该数组的引用,可能会导致难以排查的逻辑异常。
方案3:通过宿主对象管理数组
如果你的数组统一归某个对象管理,可以通过修改对象属性的方式实现更新:// 所有业务数组挂载在统一的状态对象下 const store = { incomeArray: [] }; const removeObjectFromArray = (id, arrayKey, host) => { host[arrayKey] = host[arrayKey].filter(item => item.id !== id); } // 调用 removeObjectFromArray(deleteTargetId, 'incomeArray', store);
内容的提问来源于stack exchange,提问作者Marcin
相关产品推荐
相关产品推荐

