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

JavaScript中数组作为函数参数传入时修改后外部生效情况不一致的原因

JS函数中数组形参重新赋值不影响外部变量的原因

首先明确核心结论:

  • JavaScript 中不存在严格的「按引用传递」,所有参数传递规则都是按值传递。如果传递的是引用类型(数组、对象等),传递的值是「指向堆中实际数据的内存地址拷贝」。

你遇到的现象可以拆解为3个步骤解释:

  1. 全局声明的arr1是一个存储内存地址的变量,地址指向堆中实际的[1,2,3,4]数组。
  2. 调用filterRange时,会把全局arr1存储的地址拷贝一份,赋值给函数的形参arr1。注意:函数的形参arr1是独立的局部变量,和全局的arr1是两个完全无关的变量容器,只是初始存储的内存地址相同。
  3. 函数内部执行arr1 = arr1.filter(...)时:
    • Array.filter本身是纯函数,不会修改原数组,会生成一个全新的数组并返回新的内存地址
    • 这一步赋值只是修改了*局部形参arr1*这个容器里存的地址,完全不会触碰全局arr1变量的存储内容,所以外部打印的arr1还是原来的数组。

额外补充验证:如果你在函数内不是给形参重新赋值,而是通过地址修改原数组的内容,比如执行arr1.push(5),那么全局的arr1会同步变化,因为这是通过同一个地址修改堆里的实际数据,没有改变变量本身的指向。

如果需要修改外部的arr1,可以让函数返回过滤后的新数组,在全局执行赋值即可:

// 修改后代码示例
function filterRange(arr, a, b) {
  return arr.filter(item => item >= a && item <= b)
}
arr1 = filterRange(arr1, a, b)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 14:18:02