交叉引用中修改的常量变量
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);});
下面的代码将 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);});