Javascript日期变量赋值

fhity93d  于 2023-01-19  发布在  Java
关注(0)|答案(9)|浏览(173)
var date1 = new Date();  
date1.setFullYear(2011, 6, 1);  

// 2011-07-01, ok  
console.log(date1);

// set date2 the same date as date1  
var date2 = date1;

// ...

// now I'm gonna set a new date for date2  
date2.setFullYear(2011, 9, 8);

// 2011-10-08, ok  
console.log(date2);

// 2011-10-08, wrong, expecting 2011-07-01  
// I didn't assign a new date to date1  
// WHY is date1 changed?  
console.log(date1);
yduiuuwa

yduiuuwa1#

日期是对象,因此它被指定为引用-简单的方法是

date2 = new Date( date1 );
lsmepo6l

lsmepo6l2#

执行此操作时:

date2=date1;

...你并没有创建一个 * new * Date对象,你只是从两个独立的变量指向date对象,因为只有一个对象,所以不管你查看哪个变量,你对它所做的任何修改都是显而易见的。
让我们用一些ASCII艺术来描述它:

date1 = new Date();

这给我们:

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

现在当你这样做:

date2=date1;

我们有

+-------+
+ date1 |
+-------+
| value |------+
+-------+      |          +---------------+
               +--------->| a Date object |
               |          +---------------+
+-------+      |
+ date2 |      |
+-------+      |
| value |------+
+-------+

date1date2变量的 * value * 是Date对象的 * reference *,而不是它的副本(所有对象都是这样工作的)。您可以将 * object reference * 看作是在内存中查找对象的内存地址(它 * 实际上 * 是什么取决于实现)。
这与 * primitives * 不同,后者的变量值实际上包含基元的数据,例如:

var n = 42;

结果

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

(In* theory *。实际上,字符串"primitives"的行为就好像这是真的一样,但实际上可能更像是对象。没关系,字符串是不可变的,并且字符串 * primitives * 的=====会比较它们的内容,所以我们不能真正区分它们,我们可以假装它们实际上包含在变量中。[只是为了真正让人困惑:JavaScript还有NumberString对象,它们的行为类似于对象。])
回复您的问题如下:
在此期间,创建第二个与先前存在的javascript对象相同的javascript对象的最有效方法是什么?
JavaScript对象没有通用的"克隆"操作,因此答案因对象而异。有些对象不需要克隆,因为它们是不可变的(不能改变),所以不需要克隆(例如String对象)。
要克隆一个 * 日期 *,很简单:

date2 = new Date(date1);

或者稍微更有效率的:

date2 = new Date(+date1);

(因为+告诉date1对象将其自身转换为一个数字,然后Date构造函数使用该数字。如果没有它,date1对象将被要求将其自身转换为一个字符串,然后Date构造函数将解析该字符串。仍然有效,但通过数字进行优化是一个微观的--几乎可以肯定是不成熟的优化--而且可能会干扰引擎可能想要使用的任何隐藏优化。

rslzwgfq

rslzwgfq3#

这两个日期变量只是对内存中同一个日期对象的引用,所以date2需要是date1的克隆。

var date2 = date1;

改为:

var date2 = new Date(date1.getTime());
ne5o7dgx

ne5o7dgx4#

JavaScript对Dates*(以及所有非基元--var o = {}; var j = o; j.foo = 1; console.log(o.foo); //1。另一方面,对Numbers、String和Booleans var o = 0; var j = o; j++; console.log(j); // 0)使用通过引用传递,因此这是预期的行为。
如果您需要复制日期,您可以随时

var date2 = new Date( date1.getTime() );
  • 请查看评论以了解为什么这不完全正确。
cld4siwp

cld4siwp5#

它是对date1的引用。
要达到预期效果,请执行以下操作:

var date1 = new Date();
date1.setFullYear(2011, 6, 1); 

var date2 = new Date();
date2.setTime(date1.valueOf());
ax6ht2ek

ax6ht2ek6#

    • 解决方案**是创建第二个日期,使用相同的内部毫秒值,从第一个日期复制:
var date1 = new Date();
var date2 = new Date(date1.getTime());
  • 现在 * 您有了两个不同的日期示例,可以彼此独立地操作它们。
var date1 = new Date();
alert(date1); // Sat May 26 2012 11:26:16 GMT-0400 (EDT)
var date2 = new Date(date1.getTime());
date2.setMinutes(date2.getMinutes()+10);
alert(date1); // Sat May 26 2012 11:26:16 GMT-0400 (EDT)
alert(date2); // Sat May 26 2012 11:36:16 GMT-0400 (EDT)

更多阅读:Date – MDN.

gc0ot86w

gc0ot86w7#

@SergeS答案的变体,但js中的Date()对象强制为number,因此不需要getTime():

// general case
var dateValueCopy = new Date(date1);

并使用OP变量名重新表述:

var date2 = new Date(date1);
gzszwxb4

gzszwxb48#

您需要创建date1的副本,当前date1date2引用同一个日期对象。

var date2 = new Date(date1.valueOf());
j5fpnvbx

j5fpnvbx9#

执行此操作时:

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

你在第一行创建了一个Date对象,但是第二行并不创建另一个Date对象,它只是指向或引用已经创建的Date对象。这是许多面向对象编程语言的共同特征。

相关问题