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

JavaScript函数内重新赋值非原始值:传引用与内存地址疑问

JavaScript中函数传引用的核心逻辑:重新赋值vs修改引用内容

先明确一个关键结论:JavaScript里对象(包括数组)的传递是按值传递,但这个“值”是对象在内存中的引用地址。

你的示例代码分析

var a = [9]; // 假设存储在地址0x01
function changeto5(array){ 
  array = [5]; 
}
changeto5(a); // 传入a的引用地址0x01
console.log(a) // 输出[9]

执行流程拆解:

  1. 变量a保存着指向数组[9]的内存地址0x01
  2. 调用changeto5(a)时,会把a的地址值(0x01)复制一份给函数参数array,此时array和a都指向0x01地址的数组
  3. 函数内执行array = [5]:这是给参数array重新赋值——创建了新数组[5]存在地址0x02,然后让array指向0x02。这个操作只改变了array这个参数变量的指向,完全不影响外部的a,a依然指向0x01,所以外部打印a还是[9]

为什么修改数组元素会生效?这和重新赋值不矛盾

如果把函数改成下面这样:

var a = [9];
function changeto5(array){ 
  array[0] = 5; 
}
changeto5(a);
console.log(a) // 输出[5]

这时候的操作是:
array依然指向0x01地址的数组,array[0] = 5是直接修改0x01地址里的数组内容,而外部的a也指向这个地址,所以外部能看到修改后的结果。

核心区别

  • 重新赋值参数:只是修改参数变量自身的指向,和外部变量、原内存地址的内容无关
  • 修改引用对象的内部内容:操作的是参数指向的内存地址里的数据,外部变量因为指向同一个地址,所以会同步看到变化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:30:50