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
相关产品推荐
相关产品推荐

