更新javascript日期对象

时间:2012-05-26 15:19:59

标签: javascript date object

我试图通过各种j / script本机日期对象方法更新日期对象,但是为什么更改似乎应用于页面上的所有日期对象都很困惑。

我最初发现了一个帖子,建议在日期原型中添加一个方法,但这改变了所有日期对象。然后我简化了,发现两个日期仍然在更新。我很感激有关如何防止这种情况的任何建议。我想要的是一个starTime和一个看起来有点像这样的endTime。 (注意:我最终会变成一个功能)。

time1 = new Date();
alert(time1);//returns Sat May 26 11:15:41 EDT 2012
time2=time1;
time2.setMinutes(time2.getMinutes()+10);
alert(time1); //returns Sat May 26 11:25:41 EDT 2012
alert(time2);//returns Sat May 26 11:25:41 EDT 20112  

问题:如果我只更新date2,为什么date2 = date1。

3 个答案:

答案 0 :(得分:5)

执行此操作时:

time2=time1;

...您没有创建新的 Date对象,您只是从两个单独的变量指向日期对象。只有一个对象,所以无论你看到哪个变量,你所做的任何变化都很明显。

让我们抛出一些ASCII艺术:

time1 = new Date();

这给了我们:

+-------+
+ time1 +
+-------+                 +---------------+
| value |---------------->| a Date object |
+-------+                 +---------------+

现在你做的时候:

time2=time1;

我们有

+-------+
+ time1 |
+-------+
| value |------+
+-------+      |          +---------------+
               +--------->| a Date object |
               |          +---------------+
+-------+      |
+ time2 |      |
+-------+      |
| value |------+
+-------+

time1time2变量的Date对象的引用,而不是它的副本。 (所有对象都以这种方式工作。)您可以将对象引用视为在内存中查找对象的位置的内存地址。 (实际的含义取决于实现。)

这与 primitives 不同,其中变量的值实际上包含基元的数据,例如:

var n = 42;

结果

+-----------+
+     n     |
+-----------+
| value: 42 |
+-----------+

(在理论。实际上,字符串“primitives”的行为就好像是真的,但实际上可能存储的更像是对象。无所谓,字符串是不可变的{{1字符串基元==与它们的内容进行比较,因此我们无法真正区分它们,我们可以假装它们实际上是由变量包含的。[只是真的要令人困惑:JavaScript还有===Number 对象,其行为类似于对象。])


回答你的问题:

  

在此期间,创建与先前存在的javascript对象相同的第二个javascript对象的最有效方法是什么?

JavaScript对象没有通用的“克隆”操作,因此答案因对象而异。一些您不需要克隆的对象,因为它们是不可变的(无法更改),因此不需要克隆(例如String个对象)。

要克隆日期,很容易:

String

稍微更有效:

time2 = new Date(time1);

(因为time2 = new Date(+time1); 告诉+对象将自己转换为数字,然后time1构造函数使用该数字。没有它,Date对象将被要求将自己转换为字符串,然后time1构造函数将解析该字符串。仍然有效,但通过该数字是微观的,几乎肯定是过早的优化 - 并且可能会干扰任何隐藏的优化引擎可能想要使用。所以我只选择Date。)

答案 1 :(得分:1)

到目前为止发布的two answers是正确的。 解决方案是创建第二个日期,使用相同的内部毫秒值,从第一个复制:

var time1 = new Date();
var time2 = new Date(time1.getTime());

现在你有两个不同的日期实例,你可以彼此独立地操作。

var time1 = new Date();
alert(time1); // Sat May 26 2012 11:26:16 GMT-0400 (EDT)
var time2 = new Date(time1.getTime());
time2.setMinutes(time2.getMinutes()+10);
alert(time1); // Sat May 26 2012 11:26:16 GMT-0400 (EDT)
alert(time2); // Sat May 26 2012 11:36:16 GMT-0400 (EDT)

更多阅读:Date – MDN

答案 2 :(得分:0)

执行此操作时:

time1 = new Date();  // <-- creates a new Date object
time2 = time1;       // <-- time2 gets passed a reference to the time1 object
                     //     making them effectively the same

您在第一行创建一个Date对象,但第二行创建另一个Date对象,它只指向或引用已创建的Date对象。这是许多面向对象编程语言的常见功能。