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

时间:2020-09-23 08:49:22

标签: javascript constants

下面的代码将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 }

1 个答案:

答案 0 :(得分:1)

您正在做assignment by reference

当您执行kubectl get all --all-namespaces 时,将引用“ input_data”对象。意味着对let cmd = input_data的任何更改都将反映在cmd中。

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

es5

input_data

es6

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

所以最终的代码应该是

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