JavaScript函数内重新赋值非原始值:传引用与内存地址疑问
JavaScript中函数传引用的核心逻辑:重新赋值vs修改引用内容
先明确一个关键结论:JavaScript里对象(包括数组)的传递是按值传递,但这个“值”是对象在内存中的引用地址。
你的示例代码分析
var a = [9]; // 假设存储在地址0x01 function changeto5(array){ array = [5]; } changeto5(a); // 传入a的引用地址0x01 console.log(a) // 输出[9]
执行流程拆解:
- 变量
a保存着指向数组[9]的内存地址0x01 - 调用
changeto5(a)时,会把a的地址值(0x01)复制一份给函数参数array,此时array和a都指向0x01地址的数组 - 函数内执行
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
相关产品推荐
相关产品推荐

