JavaScript'te bir nesneyi derinlemesine klonlamanın en etkili yolu nedir?
Bir JavaScript nesnesini klonlamanın en etkili yolu nedir? obj = eval(uneval(o));kullanıldığını gördüm, ancak [bu standart değil ve yalnızca Firefox tarafından destekleniyor][1].<br/><br/>
obj = JSON gibi şeyler yaptım.parse(JSON.stringify(o));` gibi şeyler yaptım ancak verimliliği sorguladım.
Ayrıca çeşitli kusurları olan özyinelemeli kopyalama işlevleri de gördüm.
Kanonik bir çözüm bulunmamasına şaşırdım.
5181
3
Yerli derin klonlama
Buna "structured cloning" deniyor, Node 11 ve sonrasında deneysel olarak çalışıyor ve umarım tarayıcılara da gelir. Daha fazla ayrıntı için bu yanıta bakın.
Veri kaybı ile hızlı klonlama - JSON.parse/stringify
Nesnenizde
Date
, fonksiyonlar,undefined
,Infinity
, RegExps, Maps, Sets, Blobs, FileLists, ImageDatas, sparse Arrays, Typed Arrays veya diğer karmaşık türleri kullanmıyorsanız, bir nesneyi derinlemesine klonlamak için çok basit bir astar vardır:JSON.parse(JSON.stringify(object))
Kıyaslamalar için Corban'ın cevabına bakınız.
Kütüphane kullanarak güvenilir klonlama
Nesneleri klonlamak önemsiz olmadığından (karmaşık tipler, dairesel referanslar, fonksiyon vb.), çoğu büyük kütüphane nesneleri klonlamak için fonksiyon sağlar. Tekerleği yeniden icat etmeyin - zaten bir kütüphane kullanıyorsanız, nesne klonlama işlevine sahip olup olmadığını kontrol edin. Örneğin,
cloneDeep
; lodash.clonedeep modülü aracılığıyla ayrı olarak içe aktarılabilir ve halihazırda derin bir klonlama işlevi sağlayan bir kütüphane kullanmıyorsanız muhtemelen en iyi seçimdirangular.copy
jQuery.extend(true, { }, oldObject)
;.clone()
yalnızca DOM öğelerini klonlarES6
Bütünlük için, ES6'nın iki sığ kopyalama mekanizması sunduğunu unutmayın:
Object.assign()
ve spread operator.Eğer yerleşik bir tane yoksa, deneyebilirsiniz: