Apps Script使用DateJs向数组推送日期出现所有值一致问题
问题原因
核心是日期对象的可变引用问题,原因分为两点:
- JavaScript中Date属于引用类型,你往
master数组push的不是日期的具体值,而是theDate变量指向的内存引用,所有push进去的引用默认指向同一个日期对象实例。 - 你使用的DateJs库的
addDays()是可变方法:它会直接修改调用它的原日期对象,同时返回原对象的引用,而非生成新的日期对象返回。
你逐行打印时输出的是修改时的即时值,所以看起来符合预期,但所有push到数组的引用最终都指向最后一次修改后的日期对象(也就是9月10日的实例),所以最终打印数组时所有日期都变成了最后一次修改的结果。
解决方法
每次把日期push到数组前,手动创建新的独立日期实例即可,避免多个引用指向同一个实例被后续修改影响:
function fixedFunction() { let master = [] let a = [1,2] a.forEach(function(b) { let theDate = Date.today() let i = 0 while (i<2) { theDate = Date.parse(theDate).addDays(1) Logger.log(theDate) // 新建独立日期实例再push master.push([b,i, new Date(theDate)]) i = i+1 } }) Logger.log(master) }
也可以在调用addDays前就完成实例拷贝,效果一致:
theDate = new Date(Date.parse(theDate)).addDays(1)
内容的提问来源于stack exchange,提问作者eceo
相关产品推荐
相关产品推荐

