更新javascript日期对象

Gre*_*bes 0 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  
Run Code Online (Sandbox Code Playgroud)

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

T.J*_*der 5

当你这样做:

time2=time1;
Run Code Online (Sandbox Code Playgroud)

...你没有创建一个 Date对象,你只是从两个单独的变量指向日期对象.只有一个对象,因此无论您查看哪个变量,您所做的任何更改都很明显.

让我们抛出一些ASCII艺术:

time1 = new Date();
Run Code Online (Sandbox Code Playgroud)

这给了我们:

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

现在你做的时候:

time2=time1;
Run Code Online (Sandbox Code Playgroud)

我们有

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

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

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

var n = 42;
Run Code Online (Sandbox Code Playgroud)

结果是

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

(理论上.事实上,字符串"原语"的行为就像是真的,但实际上可能存储的更像是对象.无所谓,字符串是不可变的,=====字符串原语比较它们的内容,所以我们不能真正说出差异,我们可以假装它们实际上是由变量包含的.[只是真的让人困惑:JavaScript也有NumberString 对象一样,它们的行为就像对象.])


你的问题如下:

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

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

要克隆日期,很容易:

time2 = new Date(time1);
Run Code Online (Sandbox Code Playgroud)

或者效率稍高:

time2 = new Date(+time1);
Run Code Online (Sandbox Code Playgroud)

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