Галоўная > Разбор пытанняў з рэальных сумоўяў - JS Core. Спосабы капіравання аб'ектаў.

Разбор пытанняў з рэальных сумоўяў - JS Core. Спосабы капіравання аб'ектаў.

сумоўе js beginner

Пытанне

Пералічыць усе спосабы кланіравання аб'ектаў.

Кароткі адказ

У 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
loveJS, 2023-02-04
Каментары

    (Каб даслаць каментар залагуйцеся ў свой уліковы запіс)

    ;