设置时间确实会影响对象

时间:2019-08-20 07:37:49

标签: javascript object time

我目前面临一个奇怪的问题,由于我不了解,我想讨论一下。

我有以下示例代码:

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相同,我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

根据documentation at MDN

  

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()});