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