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.
当你这样做:
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 |------+
+-------+
的值的time1和time2的变量是一个参考的Date对象,而不是它的一个副本.(所有对象都以这种方式工作.)您可以将对象引用视为在内存中查找对象的位置的内存地址.(它实际上取决于实施.)
这与基元不同,其中变量的值实际上包含基元的数据,例如:
var n = 42;
Run Code Online (Sandbox Code Playgroud)
结果是
+-----------+ + n | +-----------+ | value: 42 | +-----------+
(理论上.事实上,字符串"原语"的行为就像是真的,但实际上可能存储的更像是对象.无所谓,字符串是不可变的,==而===字符串原语比较它们的内容,所以我们不能真正说出差异,我们可以假装它们实际上是由变量包含的.[只是真的让人困惑:JavaScript也有Number和String 对象一样,它们的行为就像对象.])
你的问题如下:
在此期间,创建与预先存在的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);.)
| 归档时间: |
|
| 查看次数: |
2917 次 |
| 最近记录: |