函数在执行后变异一个对象参数

时间:2019-08-28 14:31:02

标签: javascript node.js typescript express

我有一个接受对象参数的函数,应该从该参数生成一个字符串值。我需要在另一个函数中使用此参数,但是在执行第一个函数时,该参数将更改。

这是接受对象参数的函数

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: '*' }

有人可以帮助我了解发生了什么

3 个答案:

答案 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] = '*';
     }
   });