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);
cevap
Hem tarih değişkenleri bellekte aynı tarih nesnesine sadece referanslarıdır olduğunu. Bu nedenle klonu olmak için date2
'a ihtiyacınız vardır. Değişim: Buna
var date2 = date1;
:
var date2 = new Date(date1.getTime());
Aynı tarih nesnesine başvurmak date1
, şu anda date1
ve date2
bir kopyasını oluşturmak gerekir.
var date2 = new Date(date1.valueOf());
JavaScript Tarihler * için referans olarak geçmek kullanır (yanı sıra tüm sivil ilkel -. var o = {}; var j = o; j.foo = 1; console.log(o.foo); //1
Öte yandan, Sayılar, Yaylı ve Boolean var o = 0; var j = o; j++; console.log(j); // 0
için), bu beklenen bir davranıştır böylece. Eğer yapabilirsiniz kopyayı bir tarihi gerekiyorsa
hep
var date2 = new Date(date1.getTime());
* Bu tamamen doğru değildir anlamak için yorum bakınız.
Gerçekten referans olarak geçmiyor. Değerin referans olduğu değerden geçer. Referans ile geçilirse referansı değiştirmek nesneyi değiştirir: a = {}; b =; b = null; 'Referans değerlendirme modeline göre, a === null 'doğru olmalı, çünkü b' * * a 'dır ve biz' b' null' olarak ayarladık. – davin
@davin Bu benim bilmediğim bir incelik. – cwallenpoole
Yukarı oy. Çok yararlı. Ancak bir detay. Eğer date2' önceden tahsis edilmişse, 'new' kullanımına gerek yoktur. Atama şu şekilde gerçekleştirilir: 'date2.setTime (date1.valueOf());'. – Karl
date2
date1
numaralı başvuru kaynağı. Eğer getTime() gerek kalmaz, js nesneleri) (
var date1 = new Date();
date1.setFullYear(2011, 6, 1);
var date2 = new Date();
date2.setTime(date1.valueOf());
Varyasyon @ Serges en cevabın ancak tarihi numarasına zorlamak:
aşağıdakileri yapın beklenen sonuçlara ulaşmak için// general case
var dateValueCopy = new Date(date1);
Ve OP ile yeniden düzenlenmiştir değişken isimleri:
var date2 = new Date(date1);
Tarih nesnelerini numaraya zorlamak için şunu deneyin: (yeni Tarih() * 1) – yzorg
<html lang="en">
<head>
<script>
function getDateDiff(time1, time2) {
var str1= time1.split('/');
var str2= time2.split('/');
var t1 = new Date(str1[2], str1[0]-1, str1[1]);
var t2 = new Date(str2[2], str2[0]-1, str2[1]);
var diffMS = t1 - t2;
console.log(diffMS + ' ms');
var diffS = diffMS/1000;
console.log(diffS + ' ');
var diffM = diffS/60;
console.log(diffM + ' minutes');
var diffH = diffM/60;
console.log(diffH + ' hours');
var diffD = diffH/24;
console.log(diffD + ' days');
alert(diffD);
}
//alert(getDateDiff('10/18/2013','10/14/2013'));
</script>
</head>
<body>
<input type="button" onclick="getDateDiff('10/18/2013','10/14/2013')" value="clickHere()" />
</body>
</html>
'date2', date1' işaretinin gösterdiği bir işaretçi olarak ayarlanıyor gibi görünüyor. – James