为什么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_
相关产品推荐
相关产品推荐

