我试图通过各种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。
答案 0 :(得分:5)
执行此操作时:
time2=time1;
...您没有创建新的 Date
对象,您只是从两个单独的变量指向日期对象。只有一个对象,所以无论你看到哪个变量,你所做的任何变化都很明显。
让我们抛出一些ASCII艺术:
time1 = new Date();
这给了我们:
+-------+ + time1 + +-------+ +---------------+ | value |---------------->| a Date object | +-------+ +---------------+
现在你做的时候:
time2=time1;
我们有
+-------+ + time1 | +-------+ | value |------+ +-------+ | +---------------+ +--------->| a Date object | | +---------------+ +-------+ | + time2 | | +-------+ | | value |------+ +-------+
time1
和time2
变量的值是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对象。这是许多面向对象编程语言的常见功能。