Разбор пытанняў з рэальных сумоўяў - JS Core. Спосабы капіравання аб'ектаў.
Пытанне
Пералічыць усе спосабы кланіравання аб'ектаў.
Кароткі адказ
У JS не існуе ўбудаванага спосабу кланіравання аб'екта.
Калі нам патрэбна не спасылка на адзін і той жа аб'ект, а паўнавартасная яго копія, можам скарыстацца некалькімі спосабамі, якія вяртаюць павярховую (shallow copy
) ці глыбокую копію (deep copy
):
-
матады аб'екта, такія, як, напрыклад,
Object.assign
-
з дапамогай
spread
-аператара -
свая рэалізацыя рэкурсіўнага абыходу аб'екта
-
JSON.parse
/JSON.stringify
-
web API
structuredClone
-
метады старонніх бібліятэк, напрыклад,
lodash cloneDeep
Падрабязны адказ
У JS не існуе ўбудаванага спосабу кланіравання аб'екта.
Капіраванне аб'екта можна зрабіць некалькімі спосабамі, якія можна падзяліць на глыбокае і павярховае капіраванне. Павярховае капіраванне азначае, што, калі мы маем складаны аб'ект, то скапіруецца толькі яго верхні узровень, а ўсе ўкладзеныя спасылачныя тыпы даных (аб'екты і масівы), будуць даступныя па спасылцы:
const obj = { b: 'b', c: { d: 'd' } }; const objCopy = {...obj};
У гэтым выпадку у objCopy
скапіруецца толькі ўласцівасць b
, а с
будзе спасылацца на адзін і той жа аб'ект { d: 'd' }
.
Глыбокае капіраванне азначае, што мы будзем мець паўнавартасную копію без спасылак.
Паверхнаснае капіраванне:
- метады аб'екта, такія, як, напрыклад,
Object.assign
const objCopy = Object.assign({}, obj);
- з дапамогай
spread
-аператара
const objCopy = {...obj};
Глыбокае капіраванне:
-
свая рэалізацыя рэкурсіўнага абыходу аб'екта
-
JSON.parse
/JSON.stringify
(існуе шэраг абмежаванняў - не капіруюцца функцыі, цыклічныя аб'екты, Symbol)
const objCopy = JSON.parse(JSON.stringify(obj));
- web API
structuredClone
const objCopy = structuredClone(obj);
- метады старонніх бібліятэк, напрыклад,
lodash cloneDeep
Каментары
(Каб даслаць каментар залагуйцеся ў свой уліковы запіс)