【问题标题】:Changing date copied from an object更改从对象复制的日期
【发布时间】:2017-04-03 16:02:50
【问题描述】:

我试图从一个对象复制一个日期属性并修改它,如下所示,但每次我尝试修改“复制”的日期属性时,我最终都会修改对象的日期属性。所以想知道有没有一种方法可以修改复制的日期而不影响原始对象中的日期属性?非常感谢任何有关示例代码的帮助。谢谢

A.对象(保存在 taskObject var 中)

{ name: 'test',
  endDate: Thu Apr 13 2017 18:46:02 GMT+0200 (EET)
}

B.代码:

let currentTaskEndDate = taskObject.endDate; //where taskObject is the object above

//The following line will result in taskObject.endDate to be updated by new date!
currentTaskEndDate.setDate(currentTaskEndDate.getDate() + Number(5)); 

【问题讨论】:

  • 使用您在那里的日期创建一个新日期,然后修改这个新日期。 javascript中的对象是通过引用传递的。这就是你看到这个的原因。

标签: javascript


【解决方案1】:

正如@yBrodsky 提到的,使用新的Date 对象并修改该对象:

例如,您可以执行以下操作:

let currentTaskEndDate = new Date(taskObject.endDate);
currentTaskEndDate.setDate(currentTaskEndDate.getDate() + 5);

【讨论】:

    【解决方案2】:

    在修改日期之前使用new Date(taskObject.endDate) 创建日期的副本:

    const origDate = new Date(2017, 3, 13, 16, 46, 2);
    
    const taskObject = {
      name: 'test',
      endDate: origDate,
    };
    
    console.log('taskObject:', taskObject);
    
    // Copy the original Date object before modifying it
    const currentTaskEndDateCopy = new Date(taskObject.endDate);
    currentTaskEndDateCopy.setDate(currentTaskEndDateCopy.getDate() + 5);
    
    console.log('New Date object:', currentTaskEndDateCopy);
    console.log('taskObject (unchanged!):', taskObject);
    .as-console-wrapper{min-height:100%}

    【讨论】:

      【解决方案3】:

      当您以这种方式复制对象时,JavaScript passes a reference 会变为原始值。

      如果你想复制没有引用的值,你需要做一个deep clone。从 lodash 签出 _.cloneDeep

      【讨论】:

        猜你喜欢
        • 2018-12-07
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-29
        • 2015-09-28
        相关资源
        最近更新 更多