如何为函数解构参数重新赋值?修改arguments后变量未更新
为什么修改arguments[0]的属性后,解构得到的变量值没变化?
核心原因是对象解构赋值的本质是值复制,而非引用绑定:
- 当你写
function createAccount({Param1, Param2, Param3, Param4})时,JS会在函数执行初期,把传入对象的Param1等属性的值,分别复制到同名的局部变量里。这些变量和原对象的属性是完全独立的两个实体,修改原对象的属性不会影响已经复制出来的变量。
你提到MDN说修改arguments会更新函数参数,那是针对普通命名参数的场景(比如function fn(a, b)),这种情况下arguments[0]和变量a是绑定的,修改其中一个会同步另一个。但你的情况里,函数的实际参数是那个完整的传入对象(也就是arguments[0]),而Param1这些是解构后生成的新局部变量,和arguments没有任何绑定关系。
如果想要让变量能同步到修改后的值,有两种常见方案:
方案1:直接操作原对象,不单独解构变量
放弃提前解构,直接使用传入的对象参数,所有操作都基于原对象的属性:
function createAccount(accountParams){ // 遍历修改原对象属性 let count = 0 for (let [Key] of Object.entries(accountParams)) { accountParams[Key] = count + 1; count += 1; } // 直接访问原对象的属性 console.log(accountParams.Param1, accountParams.Param2, accountParams.Param3, accountParams.Param4); // 输出:1 2 3 4 } createAccount({Param1: 'A', Param2: 'B', Param3: 'C', Param4: 'D'});
方案2:修改对象后重新解构一次
如果必须使用单独的变量,可以在修改完原对象后,重新执行一次解构赋值,把更新后的属性值同步到变量里:
function createAccount({Param1, Param2, Param3, Param4} = {}){ // 遍历修改arguments[0]的属性 let count = 0 for (let [Key] of Object.entries(arguments[0])) { arguments[0][Key] = count + 1; count += 1; } // 重新解构,同步更新后的属性值到变量 ({Param1, Param2, Param3, Param4} = arguments[0]); console.log(Param1, Param2, Param3, Param4); // 输出:1 2 3 4 } createAccount({Param1: 'A', Param2: 'B', Param3: 'C', Param4: 'D'});
内容的提问来源于stack exchange,提问作者volume one
相关产品推荐
相关产品推荐

