交叉引用中修改的常量变量

Const Variable Modified in Cross Reference

下面的代码将 input_data 声明为 const 变量,该变量在执行的生命周期内永远不会被修改。我希望每个 console.log 输出相同的东西 3 次,但事实并非如此。

此代码已修改为最少且易于理解,并反映了在实际代码中使用的功能和承诺。你能告诉我这是怎么发生的以及为什么会发生吗,并展示一个具有相同结构但不修改 const 变量

的工作代码

const platform = "test";
const input_data = {
  "test": true
};

function verify(data) {
  let cmd = input_data;
  cmd.valid = true;
  return cmd;
}
console.log("#req", input_data);
let command = verify(input_data);
console.log("#req", input_data);

new Promise((resolve, reject) => {
  command.executed = true;
  resolve("successs")
}).then(result => {
  console.log("#req", input_data);
});

下面是我得到的输出

#req { test: true }
#req { test: true, valid: true }
#req { test: true, valid: true, executed: true }

应该是这样的

#req { test: true }
#req { test: true }
#req { test: true }

您正在做 assignment by reference.

当您执行 let cmd = input_data 时,您引用了 'input_data' 对象。这意味着对 cmd 的任何更改都将反映在 input_data.

您可以通过创建一个新对象来防止这种情况。

es5

let cmd = Object.assign({}, input_data, {valid: true})

es6

let cmd = {...input_data, valid: true}

所以最终的代码是

const platform = "test";
const input_data = {"test": true};

function verify(data){
    let command = Object.assign({}, data);
    command.valid = true;
    return command;
}
console.log("#req", input_data);
let command = verify(input_data);
console.log("#req", input_data);

new Promise( (resolve, reject) => {
    command.executed = true;
    resolve("successs")
}).then( result => {console.log("#req", input_data);});