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

为什么JavaScript的lambda函数中对参数的赋值操作无法生效?

问题成因

这个现象的本质是 JavaScript 所有的参数传递都遵循「按值传递」规则,不存在按引用传递的逻辑,分两种情况具体说明:

  • 传入原始类型(数字、普通字符串、布尔值、null、undefined、Symbol、BigInt)时,函数收到的是原始值的拷贝:
    你示例里的a是数字5,属于原始类型,传给assign函数的只是5这个值的副本,函数内部的参数a是完全独立于外部变量的局部变量,执行a = fn(a)只是修改了这个局部变量的值,不会对外部的a产生任何影响。
  • 传入引用类型(普通对象、数组、new String()生成的字符串包装对象等)时,函数收到的是内存地址的拷贝:
    你提到的「对象类型的字符串」本质是new String()生成的包装类实例,属于引用类型。你把它传给assign函数时,内部参数a和外部变量确实指向同一个堆内存地址,但你执行的是a = fn(a),也就是直接给局部参数a重新赋值,相当于把内部a的地址指向了新的返回值,和外部原来的变量就彻底切断了关联,自然不会修改外部的变量。

如果想要修改传入引用类型的内容生效,只能通过修改引用指向的内存内容实现,举个可生效的参考示例:

const modifyObj = (obj) => {
  // 直接修改原对象的属性,不是重新赋值参数变量本身
  obj.value = obj.value * 2
}
let a = { value: 5 }
modifyObj(a)
console.log(a.value) // 输出10,符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:24:05