You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

moment().add修改已赋值变量:返回年份的函数值异常问题

问题分析与解决方案

哦,这个坑我当初刚用Moment.js的时候也踩过!核心原因是Moment.js的日期对象是可变(Mutable)的,你遇到的问题就是引用赋值导致的共享修改。

为什么会出现这个问题?

当你写const thisYear = date的时候,并没有创建一个新的日期对象——你只是把thisYear变量指向了和date完全相同的那个内存对象。所以当你调用date.add(1, 'year')时,你其实是直接修改了这个共享的对象,thisYear作为同一个对象的引用,自然也会显示修改后的结果。

怎么解决?

你需要先克隆(Clone)原日期对象,创建一个独立的副本,这样后续的修改就不会影响到原来的对象了。Moment.js提供了两种常用的克隆方式:

方法1:使用.clone()方法

这是最直观的方式,明确创建副本:

var someDate = moment()
thisYearAndNextYear(someDate)
function thisYearAndNextYear(date) {
  // 克隆原对象,得到独立的thisYear
  const thisYear = date.clone();
  console.log("thisYear = " + thisYear);
  // 基于原对象克隆后再加一年,避免修改原date
  const nextYear = date.clone().add(1, 'year');
  console.log("nextYear = " + nextYear);
  // 后续代码可安全使用两个独立对象
}

方法2:通过moment()构造函数克隆

把现有Moment对象传入moment()也会生成副本,写法更简洁:

var someDate = moment()
thisYearAndNextYear(someDate)
function thisYearAndNextYear(date) {
  const thisYear = moment(date); // 克隆原对象
  const nextYear = thisYear.clone().add(1, 'year'); // 基于thisYear克隆后加一年
  console.log("thisYear = " + thisYear);
  console.log("nextYear = " + nextYear);
}

关键提醒

所有Moment.js的修改类方法(比如add()、subtract()、set())都会直接修改调用它们的对象本身,所以只要你需要保留原始日期的状态,一定要先克隆再操作!

内容的提问来源于stack exchange,提问作者Rbar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:11:26