我目前面临一个奇怪的问题,由于我不了解,我想讨论一下。
我有以下示例代码:
const created_at = new Date();
var myObj = {
"key": "value",
"expires_in": 36000
};
Object.assign(myObj, { created_at: created_at});
var expiresInHours = Math.floor(myObj.expires_in / (60 * 60));
console.log(myObj);
var expires_at = created_at.setHours(created_at.getHours() + expiresInHours);
console.log(myObj);
expires_at = new Date(expires_at);
Object.assign(myObj, { expires_at: expires_at });
console.log(myObj);
似乎created_at.setHours
所在的行确实影响了我的对象。为什么在执行myObj.created_at
函数后myObj.expires_at
的值与.setHours
相同,我该如何解决这个问题?
答案 0 :(得分:0)
setHours()方法根据本地时间设置指定日期的小时数,并返回自1970年1月1日UTC到更新的Date实例表示的时间为止的毫秒数。
它明确说明了为什么它会表现出您观察到的方式。
如果只想更改expires_at
,则必须复制created_at
,然后进行更新。
const created_at = new Date();
var myObj = {
"key": "value",
"expires_in": 36000
};
Object.assign(myObj, {
created_at: created_at
});
var expiresInHours = Math.floor(myObj.expires_in / (60 * 60));
console.log(myObj);
/// Copy and update
var expires_at = new Date(created_at).setHours(created_at.getHours() + expiresInHours);
console.log(myObj);
expires_at = new Date(expires_at);
Object.assign(myObj, {
expires_at: expires_at
});
console.log(myObj);
编辑:这似乎对JavaScript常量感到困惑。再次from the docs
const
声明创建对值的只读引用。它不是不是,意味着它拥有的值是不变的,只是不能重新分配变量标识符。例如,在内容是对象的情况下,这意味着可以更改对象的内容(例如其属性)。
因此,虽然您不能更改const
来引用其他值,但是可以更新该值的属性。
答案 1 :(得分:0)
setHours()修改其调用日期,然后返回修改后的对象的getTime()。我想您只需要删除任务...
var expires_at = expires_at.setHours(created_at.getHours()+ expiresInHours);
答案 2 :(得分:0)
编写此行时:
Object.assign(myObj, { created_at: created_at});
created_at
变量是Compound。复合值是参考传递。因此,当created_at.setHours
会更改created_at
对象中键myObj
的值
要解决您的问题,可以使用以下简单代码进行更改:
//Object.assign(myObj, { created_at: created_at});
Object.assign(myObj, { created_at: new Date()});