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

如何为函数解构参数重新赋值?修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:38:18