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

Javascript 交叉引用中修改的常量变量,javascript,constants,Javascript,Constants,下面的代码将一个input_data声明为一个const变量,该变量在执行生命周期内从未修改过。我希望每个console.log都能输出相同的内容3次,但事实并非如此 这段代码被修改为最小的、易于理解的代码,并且反映了我在实际代码中使用的函数和承诺。您能否告诉我这是如何发生的以及为什么发生的,并显示一个具有相同结构的工作代码,该代码不修改const变量 const platform=“测试”; 常量输入_数据={ “测试”:正确 }; 功能验证(数据){ 设cmd=输入_数据; cmd.val

下面的代码将一个
input_data
声明为一个
const
变量,该变量在执行生命周期内从未修改过。我希望每个
console.log
都能输出相同的内容3次,但事实并非如此

这段代码被修改为最小的、易于理解的代码,并且反映了我在实际代码中使用的函数和承诺。您能否告诉我这是如何发生的以及为什么发生的,并显示一个具有相同结构的工作代码,该代码不修改
const
变量

const platform=“测试”;
常量输入_数据={
“测试”:正确
};
功能验证(数据){
设cmd=输入_数据;
cmd.valid=true;
返回cmd;
}
控制台日志(“#req”,输入#u数据);
let命令=验证(输入数据);
控制台日志(“#req”,输入#u数据);
新承诺((解决、拒绝)=>{
command.executed=true;
解决(“成功”)
})。然后(结果=>{
控制台日志(“#req”,输入#u数据);
});您正在执行的操作

执行
时,让cmd=input\u data
引用“input\u data”对象。这意味着对
cmd
的任何更改都将反映在
input_data

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

es5 es6
let cmd={…输入_数据,有效: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);});

javascript通过引用进行赋值。将一个对象声明为const不会阻止您更改其键处的值。是的,您可以这样做
let cmd=input_data
now命令是您的输入对象,因为它是对原始对象的引用。然后执行
cmd.valid=true
时,向原始对象添加了另一个键/值对,但没有违反常量,因为cmd正在引用输入数据。我告诉过你三次了。请通过引用了解作业。如果你想阻止它,顺便说一句,创建一个全新的对象。使用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);});