Bir Date nesnesini klonlama


498

Bir Datedeğişkene başka bir değişken atamak , referansı aynı örneğe kopyalar. Bu, birinin değiştirilmesinin diğerini değiştireceği anlamına gelir.

Bir Dateörneği nasıl klonlayabilir veya kopyalayabilirim ?

Yanıtlar:


738

Date nesnesinin getTime()1 Ocak 1970 00:00:00 ( dönem ) tarihinden sonraki milisaniye sayısını döndüren yöntemini kullanın :

var date = new Date();
var copiedDate = new Date(date.getTime());

Safari 4'te şunları da yazabilirsiniz:

var date = new Date();
var copiedDate = new Date(date);

... ancak bunun diğer tarayıcılarda çalışıp çalışmadığından emin değilim. (IE8'de çalışıyor gibi görünüyor).


9
Bu pasaj için JSON? Bu insanlar gibi temelleri açık olmalıdır ... JavaScript DOM için jQuery yanlış gibi.
Boldewyn

17
Bu güzel çözümü yazmanın başka bir yolu da Tarih prototipini genişletmek olacaktır: Date.prototype.clone = function() { return new Date(this.getTime()); }; Daha sonra şu şekilde kullanabilirsinizcopiedDate = date.clone();
Ryan

6
copiedDate = new Date(date)Yaklaşım IE6 + çalışır. Firefox'ta iki seçenek aynı hızda.
Ryan

14
new Date(date)Aynı şekilde new Date(date.getTime()), JS aramaya çalışacağız çünkü date.valueOf()bu bir numara gerektiğinde ve date.valueOf()aynıdır date.getTime(), referans Date.valueOf Object.valueOf
Steely Kanat

10
Kullanmayın new Date(date), kullanmayın new Date(date.getTime()veya new Date(date.valueOf)bunun yerine ilk yol en azından Firefox ve IE (Chrome değil) içindeki tarihler arasında farklılıklara yol açabilir. Örneğin toISOString()Firefox'ta her iki tarihte kullanmak "2015-04-21T04:56:42.000Z"ve üretir "2015-04-21T04:56:42.337Z".
crudh

114

Bu en temiz yaklaşım

let dat = new Date() 
let copyOf = new Date(dat.valueOf())

console.log(dat);
console.log(copyOf);


9
"Date" nesneleri için "valueOf ()" yöntemi, "getTime ()" yöntemiyle (dönemden bu yana geçen milisaniye sayısı) aynı sonucu üretir.
Steve Harrison

35
@Steve: true, ancak getTime () yalnızca zamanı döndürdüğü ve "tarihi" içermediği için "en iyi" görünebilir ve dolayısıyla "en temiz" referansım. Açıkçası Javascript'teki Tarih türü biraz felaket bölgesidir, ilk etapta asla değiştirilemezdi.
AnthonyWJones

1
@AnthonyWJones: Doğru, ne demek istediğini anlıyorum.
Steve Harrison

3
Kabul ediyorum .valueOf () daha açıktır. Bazen unutuyorum ve benim için .getMilliseconds () b / c kullandığım gibi geliyor, çağdan beri ortalama milisaniye anlamına geliyor.
Tom Wayson

1
Steve Harrison'a +1: Durumun böyle olup olmadığını merak ediyordum, açıklama için teşekkürler.
Brian Lacy


14

Basitleştirilmiş sürüm:

Date.prototype.clone = function () {
    return new Date(this.getTime());
}

72
yerleşik nesnelerle
Pawel

3
Sahip olmadığın nesnelerle uğraşmayacaksın. Yeni bir kopya çıkarmalı ve onu kapsamınıza uygun olarak SuperDate veya başka bir şey olarak adlandırmalısınız. Hatalar için test edilmesi zor olan şey, nesne işlevinin beklenmedik şekilde değişmesinden kaynaklanır.
Ray Foss

Bu işe yarar, ancak sürdürülebilirlik nedenleriyle, Bu yaklaşım bir kod kokusu olarak kabul edilir. Kodlamamda
Allan Chua

1
Ayrıca ilk etapta yerleşik yöntem eklemek için bu ihtiyacı görmüyorum. Çalışma fonksiyonel programlama ve iyi bir eski moda fonksiyonu aslında çok daha güçlü nesnesinin kendisi yöntemlerine göre daha olduğunu keşfetmek. Aynı zamanda daha kısa: const cloneDate = d => new Date(d.getTime()).
Stijn de Witt

6

Bu basit atamanın da işe yaradığını öğrendim:

dateOriginal = new Date();
cloneDate = new Date(dateOriginal);

Ama bunun ne kadar "güvenli" olduğunu bilmiyorum. IE7 ve Chrome 19'da başarıyla test edildi.


9
Kullanmayın new Date(date), kullanmayın new Date(date.getTime()veya new Date(date.valueOf)bunun yerine ilk yol en azından Firefox ve IE (Chrome değil) içindeki tarihler arasında farklılıklara yol açabilir. Örneğin toISOString()Firefox'ta her iki tarihte kullanmak "2015-04-21T04:56:42.000Z"ve üretir "2015-04-21T04:56:42.337Z".
crudh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.