我有一个接受对象参数的函数,应该从该参数生成一个字符串值。我需要在另一个函数中使用此参数,但是在执行第一个函数时,该参数将更改。
这是接受对象参数的函数
export const generateCron(cronRules: any): string {
const cronKeys: Array<string> = ['minute', 'hour', 'day', 'month', 'year'];
cronKeys.forEach(key => {
if (!cronRules[key]) {
cronRules[key] = '*';
}
});
const { minute, hour, day, month, year } = cronRules;
const cron: string = `${minute} ${hour} ${day} ${month} ${year}`;
return cron;
}
这是调用函数的方式
const { cron } = data;
console.log(cron)
const cronRules: string = generateCron(cron);
console.log(cron)
假设我的cron对象为{ minute: 1, hour: 2 }
,
函数按预期返回1 2 * * *
。但安慰了克朗
对象(第二个控制台)对象已更改为
{ minute: 1, hour: 2, day: '*', month: '*', year: '*' }
有人可以帮助我了解发生了什么
答案 0 :(得分:1)
对象是通过javascript中的引用传递的,因此调用
cronRules[key] = '*';
您正在更改传递给函数的“ cron”对象。
您可以将其用于整个功能,而不必弄乱cron对象:
const { minute, hour, day, month, year } = cronRules;
const cron: string = `${minute || '*'} ${hour || '*'} ${day || '*'} ${month || '*'} ${year || '*'}`;
return cron;
无需修改原始的“ cron”对象即可完成相同的任务。
答案 1 :(得分:0)
使用
cronRules[key] = '*';
由于javascript是对象的传递参考语言,因此您正在对传递给函数的对象进行变异
答案 2 :(得分:0)
仅由于在循环中迭代cronRules
,您需要引用cronRules
并对其进行更改。
const ref = JSON.parse(JSON.stringify(cronRules));
const cronKeys: Array<string> = ['minute', 'hour', 'day', 'month', 'year'];
cronKeys.forEach(key => {
if (!ref[key]) {
ref[key] = '*';
}
});