További
Mi a leghatékonyabb módja egy objektum mélyklónozásának JavaScriptben?
Mi a leghatékonyabb módja egy JavaScript objektum klónozásának? Láttam, hogy az obj = eval(uneval(o));
-t használják, de ez nem szabványos, és csak a Firefox támogatja.
I've done things like obj = JSON.parse(JSON.stringify(o));
, de megkérdőjelezem a hatékonyságot. <br/br/><br/br/> Láttam rekurzív másoló függvényeket is különböző hibákkal.
<br/br />
I'm meglepő, hogy nincs kanonikus megoldás.
5181
3
Natív mély klónozás
Ezt "strukturált klónozásnak" hívják, kísérletképpen működik a Node 11-ben és később, és remélhetőleg a böngészőkben is landol. További részletekért lásd ez a válasz.
Gyors klónozás adatvesztéssel - JSON.parse/stringify
Ha nem használsz
Date
s, függvényeket,undefined
,Infinity
, RegExps, Maps, Sets, Blobs, FileLists, ImageDatas, sparse Arrays, Typed Arrays vagy más összetett típusokat az objektumodon belül, egy nagyon egyszerű egysoros egy objektum mélyklónozásához:JSON.parse(JSON.stringify(object))`
Lásd Corban's answer a benchmarkokat.
Megbízható klónozás könyvtár használatával
Mivel az objektumok klónozása nem triviális (összetett típusok, körkörös hivatkozások, függvények stb.), a legtöbb nagy könyvtár biztosít funkciót az objektumok klónozására. Ne találd fel újra a kereket - ha már használsz egy könyvtárat, ellenőrizd, hogy van-e benne objektumklónozó funkció. Például,
cloneDeep
; külön importálható a lodash.clonedeep modulon keresztül, és valószínűleg a legjobb választás, ha még nem használsz olyan könyvtárat, amely mély klónozási funkciót biztosít.angular.copy
jQuery.extend(true, { }, oldObject)
;.clone()
csak DOM elemeket klónoz.ES6
A teljesség kedvéért jegyezzük meg, hogy az ES6 két sekély másolási mechanizmust kínál:
Object.assign()
és a spread operator.Ha nem lenne beépített, megpróbálhatná: