arrays objects and mutations - Lee-hyuna/33-js-concepts-kr GitHub Wiki

λ°°μ—΄κ³Ό 객체 그리고 변이

원문: Arrays, Objects and Mutations

Javascriptμ—μ„œ λ°°μ—΄ 및 객체둜 μž‘μ—…ν•  λ•Œ λΆˆλ³€ν•œ(immutable) 데이터 ꡬ쑰인 것 처럼 μ²˜λ¦¬ν•˜μ—¬, 변이λ₯Ό λ§‰λŠ” λͺ‡κ°€μ§€ 방법에 λŒ€ν•΄ μ†Œκ°œν•œλ‹€.

λ³€μ΄λž€ 무엇인가?

λΆˆλ³€μ˜ κ°’(imutable value)은 ν•œλ²ˆ λ§Œλ“€μ–΄ 진 λ‹€μŒμ—” 변경이 λ˜μ§€ μ•ŠλŠ” 값을 λ§ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„  숫자, λ¬Έμžμ—΄, λΆˆλ¦¬μ–Έκ³Ό 같은 μ›μ‹œ 값이듀이 항상 λΆˆλ³€ 인 값이닀. κ·ΈλŸ¬λ‚˜ λ°°μ—΄κ³Ό 객체 같은 λ°μ΄ν„°κ΅¬μ‘°λŠ” 그렇지 μ•Šλ‹€.

λ³€μ΄λž€ 원본 μš”μ†Œλ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ 영ν–₯을 μ£ΌλŠ” 것을 μ˜λ―Έν•œλ‹€. 우리의 λͺ©ν‘œλŠ” μ›λž˜ μš”μ†Œλ₯Ό 항상 λ³€κ²½λ˜μ§€ μ•Šκ²Œ ν•˜λŠ” 것이닀.

λ³€μ΄λŠ” λΆ€μž‘μš©μ΄λ‹€: ν”„λ‘œκ·Έλž¨μ—μ„œ λ³€ν•˜λŠ” 것이 μ μ„μˆ˜λ‘ 좔적해야 ν•  것이 적어지기 λ•Œλ¬Έμ—, ν”„λ‘œκ·Έλž¨μ΄ 더 간단해진닀.

원본 μš”μ†Œμ— λŒ€ν•œ 변이λ₯Ό λ°œμƒμ‹œν‚€λŠ” λ©”μ†Œλ“œλ₯Ό ❌둜, λΆˆλ³€ν•œ λ©”μ†Œλ“œλŠ” βœ…λ‘œ ν‘œμ‹œν–ˆλ‹€.

배열에 μƒˆλ‘œμš΄ μš”μ†Œ μΆ”κ°€ν•˜κΈ°

  • Array.prototype.push ❌
  • Array.prototype.unshift ❌
  • Array.prototype.concat βœ…
  • Spread Operator (ES6) βœ…

[Array.prototype.push](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/push)λŠ” λ°°μ—΄μ˜ λ§ˆμ§€λ§‰μ— μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ²Œ ν•œλ‹€. 이 λ©”μ†Œλ“œλŠ” μƒˆλ‘œμš΄ 사본을 λ°˜ν™˜ν•˜μ§€ μ•Šκ³ , μƒˆ μš”μ†Œλ₯Ό μΆ”κ°€ν•˜μ—¬ μ›λž˜ 배열을 λ³€κ²½ν•˜κ³  μƒˆλ‘œμš΄ length 속성을 가진 배열을 λ°˜ν™˜ν•œλ‹€.

const numbers = [1, 2];
numbers.push(3); // results in numbers being [1, 2, 3]

[Array.prototype.unshift](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift)λŠ” λ°°μ—΄μ˜ μ•žλΆ€λΆ„μ— μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό μΆ”κ°€ν•  λ•Œ μ‚¬μš©ν•œλ‹€. 즉 push, unshiftλŠ” μˆ˜μ • 된 λ°°μ—΄μ˜ μƒˆ 볡사본을 λ°˜ν™˜ν•˜μ§€ μ•Šκ³ , μƒˆλ‘œμš΄ lengthλ₯Ό 가진 배열을 λ°˜ν™˜ν•œλ‹€.

const numbers = [2, 3];
numbers.unshift(1); // results in numbers being [1, 2, 3]

이 두 가지 μ˜ˆμ œλ“€μ€ μ›λž˜μ˜ 배열을 λ³€κ²½ν•˜κ³  μžˆλ‹€. 원본 배열을 λ³€κ²½ν•˜μ§€ μ•Šκ³  μœ μ§€ν•˜λŠ” 것이 λͺ©ν‘œλΌλŠ” 점을 기얡해라. 원본을 λ³€κ²½ν•˜μ§€ μ•Šκ³  배열에 μƒˆ μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λŠ” λͺ‡ 가지 λŒ€μ•ˆμ„ μ‚΄νŽ΄λ³΄μž.

μ•„λ§ˆλ„ κ°€μž₯ μ‰¬μš΄ 방법은 μ•„λž˜μ™€ 같이 원본 λ°°μ—΄μ˜ 볡사본을 μƒμ„±ν•˜κ³  직접 μΆ”κ°€ν•˜λŠ” 것일 것이닀.

const numbers = [1, 2];  
const moreNumbers = numbers.slice();

moreNumbers.push(3);

μš°λ¦¬λŠ” 이것을 "ν†΅μ œλœ 변이"라고 λΆ€λ₯Ό 수 μžˆμ„ 것이닀. 원본이 μ•„λ‹Œ 볡사본을 가지고 μ‹€μ œλ‘œ λ°°μ—΄μ˜ 변이λ₯Ό ν•˜κ³  있기 λ•Œλ¬Έμ΄λ‹€. κ·ΈλŸ¬λ‚˜ [Array.prototype.slice](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)λŠ” 원본 λ°°μ—΄μ˜ κΉŠμ€ 볡사본을 μƒμ„±ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— κΉŒλ‹€λ‘œμšΈ 수 μžˆλ‹€.

[Array.prototype.concat](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/concat)은 μ‹€μ œλ‘œ μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•˜λŠ”λ°, 이것이 μš°λ¦¬κ°€ μ›ν•˜λŠ” 것이닀. 이 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 원본에 μƒˆλ‘œμš΄ μš”μ†Œκ°€ μΆ”κ°€λœ μƒˆ 배열을 λ°˜ν™˜ν•  수 μžˆλ‹€. μ•„λž˜λ₯Ό 보자:

const numbers = [1, 2];  
const moreNumbers = numbers.concat([3]);

slice와 κ·Έλž¬λ“―μ΄, concat도 원본 λ°°μ—΄μ˜ 얕은 볡사본을 λ°˜ν™˜ν•œλ‹€. 이것은 객체와 λ°°μ—΄ λͺ¨λ‘μ— λŒ€ν•œ 참쑰만 λ³΅μ‚¬ν•œλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. μ˜¨μ „ν•œ μƒˆλ‘œμš΄ λ°°μ—΄μ˜ 볡사본을 λ°˜ν™˜λ°›κΈΈ μ›ν•œλ‹€λ©΄, Lodash의 [cloneDeep](https://lodash.com/docs/#cloneDeep)λ₯Ό μ΄μš©ν•˜λŠ” 것을 κ³ λ €ν•΄λ³΄μž. λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λœ λ°°μ—΄κ³Ό 객체λ₯Ό μž¬κ·€μ μœΌλ‘œ λ³΅μ œν•œλ‹€.

const people = [{ name: 'Bob' }, { name: 'Alice' }];  
const morePeople = cloneDeep(people).concat([{ name: 'John' }]);

console.log(people[0] === morePeople[0]); // returns false

얕은 볡사 vs κΉŠμ€ λ³΅μ‚¬λŠ” 이 κΈ€ 전체에 λ‚˜νƒ€λ‚˜λŠ” 반볡적인 μ£Όμ œμ΄λ‹€. 원본 λ°°μ—΄μ˜ μš”μ†Œκ°€ λ°°μ—΄μ΄κ±°λ‚˜ 객체이고, 이λ₯Ό 원본 κ·ΈλŒ€λ‘œ μœ μ§€ν•΄μ•Όν•˜λŠ” 경우 항상 cloneDeep을 μ‚¬μš©ν•΄λΌ. κ·ΈλŸ¬λ‚˜ κΉŠμ€ λ³΅μ‚¬λŠ” μ„±λŠ₯ λ©΄μ—μ„œ λΉ„μš©μ΄ 많이 λ“œλŠ” μž‘μ—…μ΄λΌλŠ” 것을 λͺ…μ‹¬ν•˜λΌ. μ•„λ§ˆ 항상 κΉŠμ€ 볡사본을 ν•„μš”λ‘œ ν•˜λŠ” 것은 아닐 것이닀. 사싀, κ°€λŠ₯ν•œν•œ κΉŠμ€ 볡사본을 λ§Œλ“œλŠ” 것을 ν”Όν•΄μ•Όν•œλ‹€. 정말 ν•„μš”ν•˜κ³  μ‚¬μš©ν•΄μ•Όν•œλ‹€λ©΄, 이율배반(tradeoffs)을 μ•Œκ³  μžˆμ–΄μ•Όν•œλ‹€.

배열에 μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό λ°°μ—΄μ˜ 변경없이 μΆ”κ°€ν•˜λŠ” λ°©λ²•μœΌλ‘œ λ‹€μ‹œ λŒμ•„κ°€μ„œ, ES6 이후 μ‚¬μš© κ°€λŠ₯ν•œ spread operatorλ₯Ό concat λŒ€μ‹ μ— μ‚¬μš©ν•  수 μžˆλ‹€.

const numbers = [1, 2];  
const moreNumbers = [...numbers, 3];

μ§€κΈˆκΉŒμ§„ λ°°μ—΄μ˜ 맨 μ²˜μŒμ΄λ‚˜ 맨 끝에 μš”μ†Œλ₯Ό μΆ”κ°€ν–ˆμ§€λ§Œ, [Array.prototype.splice](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)λ₯Ό μ‚¬μš©ν•˜λ©΄ λ°°μ—΄μ˜ μ–΄λŠ μœ„μΉ˜μ—λ‚˜ μš”μ†Œλ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€. spliceλŠ” 원본 배열을 λ³€κ²½ν•˜λ‹ˆ λͺ…μ‹¬ν•˜λΌ.

const positions = ['First', 'Second', 'Fifth', 'Sixth', 'Seventh'];
positions.splice(2, 0, 'Third', 'Fourth');

μœ„μ˜ μ˜ˆμ œμ—μ„œ, λ‘λ²ˆμ§Έ λ§€κ°œλ³€μˆ˜(0)의 μ˜λ―ΈλŠ” "아무것도 μ œκ±°ν•˜μ§€ 말 것"이닀.

λ˜ν•œ, μš°λ¦¬λŠ” concat을 μ‚¬μš©ν•˜μ—¬ μ›λž˜ 배열을 λ³€κ²½ν•˜μ§€ μ•Šκ³ λ„ λ™μΌν•œ κ²°κ³Όλ₯Ό 얻을 수 μžˆλ‹€.

const positions = ['First', 'Second', 'Fifth', 'Sixth', 'Seventh'];  
const morePositions = positions
.slice(0, 2)  
.concat(['Third', 'Fourth'])  
.concat(positions.slice(2));

더블어 spread operatorsλ‘œλ„ 이 μž‘μ—…μ„ ν•  수 μžˆλ‹€.

const positions = ['First', 'Second', 'Fifth', 'Sixth', 'Seventh'];  
const morePositions = [  
...positions.slice(0, 2),  
'Third',  
'Fourth',  
...positions.slice(2)  
];

객체에 μƒˆλ‘œμš΄ 속성 μΆ”κ°€ν•˜κΈ°

  • 직접 μΆ”κ°€ν•˜κΈ° ❌
  • Object.assign (ES6) βœ…
  • Object spread operator (아직 ν‘œμ€€μ΄ μ•ˆλœ μ‹€ν—˜μ μΈ κΈ°λŠ₯) βœ…

μš°λ¦¬λŠ” 속성을 직접 μ„€μ •ν•¨μœΌλ‘œμ¨ μ‰½κ²Œ μƒˆλ‘œμš΄ 속성을 μΆ”κ°€ν•  수 μžˆλ‹€. λ¬Όλ‘  이것은 μ›λž˜ 객체의 λŒ€ν•œ 변이λ₯Ό μΌμœΌν‚¨λ‹€.

const person = { name: 'John Doe', email: '[email protected]' };// Using dot notation  

person.age = 27;// Using array notation  

person['nationality'] = 'Irish';

μ•„λ§ˆ 원본 객체λ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  μƒˆλ‘œμš΄ 속성을 μΆ”κ°€ν•˜λŠ” κ°€μž₯ κ΄‘λ²”μœ„ν•œ 해결방법은 [Object.assign](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) λ˜λŠ” Lodash의 [assign](https://lodash.com/docs/#assign)을 μ‚¬μš©ν•˜λŠ” 것일 수 μžˆλ‹€.

const person = { name: 'John Doe', email: '[email protected]' };  
const samePerson = Object.assign({}, person, {  
  age: 27,  
  nationality: 'Irish'  
});

Object.assign에 λŒ€ν•œ μ°Έκ³ : 첫 번째 μΈμˆ˜κ°€ 빈 객체인 것을 확인해보라. Object.assign은 μ „λ‹¬ν•œ 첫번째 λ§€κ°œλ³€μˆ˜λ₯Ό λ³€ν˜•μ‹œν‚¨λ‹€. 이 μ—°μ‚°μžμ— μ˜ν•΄ person이 μˆ˜μ •λ˜λŠ” 것을 μ›μΉ˜ μ•ŠκΈ° λ•Œλ¬Έμ—, 첫 번째 인수둜 person이 μ•„λ‹Œ {}을 μ „λ‹¬ν•˜λŠ” 것이닀. 원본 객체λ₯Ό λ³€ν˜•μ‹œν‚€μ§€ μ•Šκ³  μœ μ§€ν•˜λ €λ©΄ 항상 빈 객체λ₯Ό 첫 번째 맀개 λ³€μˆ˜λ‘œ μ „λ‹¬ν•˜λΌ.

λ°°μ—΄κ³Ό 것과 λ§ˆμ°¬κ°€μ§€λ‘œ, 아직 ν‘œμ€€μ΄ μ•„λ‹Œ object spread operator λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. object spread operatorλŠ” κ°œλ…μ μœΌλ‘œ ES6의 array spread operator와 μœ μ‚¬ν•˜λ‹€.

const person = { name: 'John Doe', email: '[email protected]' };  
const samePerson = { ...person, age: 27, nationality: 'Irish' };

λ°°μ—΄μ—μ„œ μš”μ†Œ μ œκ±°ν•˜κΈ°

  • Array.prototype.splice ❌
  • Array.prototype.pop ❌
  • Array.prototype.shift ❌
  • Array.prototype.slice & Array.prototype.concat βœ…
  • Array.prototype.slice & the ES6 Spread Operator βœ…
  • Array.prototype.filter βœ…

[Array.prototype.splice(index, number)](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)λŠ” indexμ—μ„œ μ‹œμž‘ν•˜μ—¬ number 갯수만큼 μš”μ†Œλ₯Ό μ œκ±°ν•œλ‹€. 그리고 제거된 μš”μ†Œμ˜ 배열을 λ°˜ν™˜ν•œλ‹€.

const cities = ['Oslo', 'Rome', 'Cork', 'Paris', 'London', 'Bern'];

cities.splice(2, 1); // removes 1 element from the 2nd index (Cork)

[Array.prototype.pop](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/pop)λŠ” λ°°μ—΄μ˜ λ§ˆμ§€λ§‰ μš”μ†Œλ₯Ό μ œκ±°ν•˜λŠ”λ° μ‚¬μš©ν•œλ‹€. λ˜ν•œ 제거된 μš”μ†Œλ₯Ό λ°˜ν™˜ν•œλ‹€. Array.prototype.push의 μ—­ ν•¨μˆ˜μ΄λ‹€.

const cities = ['Oslo', 'Rome', 'Cork', 'Paris', 'London', 'Bern'];  
const bern = cities.pop(); // removes Bern from the list of cities

λ°°μ—΄μ˜ 첫 번째 μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³  λ°˜ν™˜ν•˜λŠ” [Array.prototype.shift](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/shift)도 μžˆλ‹€. μ΄λŠ” Array.prototype.unshift의 μ—­κΈ°λŠ₯이닀.

const cities = ['Oslo', 'Rome', 'Cork', 'Paris', 'London', 'Bern'];  
const oslo = cities.shift(); // removes Oslo from the list of cities

splice, pop 그리고 shift λͺ¨λ‘ 원본 배열을 λ³€ν˜•μ‹œν‚¨λ‹€. 이제 원본 배열을 변이 μ‹œν‚€μ§€ μ•ŠλŠ” λͺ‡κ°€μ§€ 방법을 μ‚΄νŽ΄λ³΄μž.

μ•žμ˜ 예의 λ„μ‹œ λ°°μ—΄μ—μ„œ Corkλ₯Ό μ œκ±°ν•œλ‹€κ³  κ°€μ •ν•˜μž. 이λ₯Ό λ‹¬μ„±ν•˜κΈ° μœ„ν•΄ μš°λ¦¬λŠ” slice와 concat의 쑰합을 μ‚¬μš©ν•˜μ—¬ 원본 λ°°μ—΄μ˜ 슬라이슀 사본을 λ§Œλ“  λ‹€μŒ(μ²˜μŒλΆ€ν„° 두 번째 μš”μ†ŒκΉŒμ§€ ν¬ν•¨ν•˜μ§€ μ•ŠμŒ) 원본 λ°°μ—΄μ˜ λ‹€λ₯Έ μ„Έ 번째 μœ„μΉ˜μ—μ„œλΆ€ν„° μ„Έ 번째 μœ„μΉ˜κΉŒμ§€ μŠ¬λΌμ΄μŠ€μ™€ μ—°κ²°ν•˜λ©΄ λœλ‹€. μ΄λ ‡κ²Œ ν•΄μ„œ 두 번째 μΈμˆ˜μ— μœ„μΉ˜ν•œ μ›μ†Œ(Cork)λ₯Ό μ œκ±°ν–ˆλ‹€.

const cities = ['Oslo', 'Rome', 'Cork', 'Paris', 'London', 'Bern'];  
const capitals = cities  
.slice(0, 2)  
.concat(cities.slice(3));

λ˜‘κ°™μ€ κ²°κ³Όλ₯Ό spread operatorλ₯Ό μ‚¬μš©ν•˜μ—¬ 얻을 수 μžˆλ‹€.

const cities = ['Oslo', 'Rome', 'Cork', 'Paris', 'London', 'Bern'];  
const capitals = [  
...cities.slice(0, 2),  
...cities.slice(3)  
];

[Array.prototype.filter](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)λ₯Ό μ‚¬μš©ν•˜μ—¬ μ œκ±°ν•˜λ €λŠ” μš”μ†Œλ₯Ό 필터링 ν•  수 μžˆλ‹€. 이 λ©”μ†Œλ“œλŠ” μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•œλ‹€.

const cities = ['Oslo', 'Rome', 'Cork', 'Paris', 'London', 'Bern'];  
const capitals = cities.filter(city => city !== 'Cork');

인덱슀둜 μš”μ†Œλ₯Ό 필터링할 수 μžˆλ‹€.

const cities = ['Oslo', 'Rome', 'Cork', 'Paris', 'London', 'Bern'];  
const capitals = cities.filter((city, index) => index !== 2);

κ°μ²΄μ—μ„œ 속성 μ œκ±°ν•˜κΈ°

  • delete μ—°μ‚°μž ❌
  • Object destructuring βœ…
  • Lodash’s pick and omit βœ…

delete μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ κ°μ²΄μ—μ„œ 속성을 μ œκ±°ν•  수 μžˆλ‹€. λ¬Όλ‘  원본 객체의 변이λ₯Ό μΌμœΌν‚¨λ‹€.

const person = { name: 'John Doe', email: '[email protected]', age: 27 };
// dot notation  
delete person.age;
// array notation  
delete person['age'];

변이λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ ES6의 sperad operatorλ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€. (object destructuring)

const person = {  
  name: 'John Doe',  
  email: '[email protected]',  
  age: 27,  
  country: 'Australia',  
  language: 'English',  
  profession: 'Front End Developer'  
};

const { profession, country, ...newPerson } = person;
console.log(newPerson);

profession κ³Ό country κ°€ μƒˆ κ°μ²΄μ—μ„œ μ œκ±°λœλ‹€.

λ˜ν•œ Lodash의 [pick](https://lodash.com/docs/#pick)와 [omit](https://lodash.com/docs/#omit)λ₯Ό μ΄μš©ν•  수 μžˆλ‹€. 첫 번째 μΈμˆ˜λŠ” μž‘μ—… ν•  객체이고, 두 번째 μΈμˆ˜λŠ” λ¬Έμžμ—΄ λ˜λŠ” μ œκ±°ν•˜λ €λŠ” μ†μ„±μ˜ λ¬Έμžμ—΄ λ°°μ—΄ 일 수 μžˆλ‹€. λ‘˜ λ‹€ μƒˆλ‘œμš΄ 객체λ₯Ό λ°˜ν™˜ν•œλ‹€.

const person = { name: 'John Doe', email: '[email protected]', age: 27 };  
const fewerDetails = _.omit(person, 'age');// or we could use pick which is the inverse of omit  
const fewerDetails = _.pick(person, ['name', 'email']);

κ²°λ‘ 

  • 변이가 ν—ˆμš©λ˜μ§€ μ•ŠλŠ” 상황(예:λ¦¬λ•μŠ€ reducers)이 μ‘΄μž¬ν•˜μ§€λ§Œ, λ§Žμ€ λ‹€λ₯Έ κ²½μš°μ—λŠ” λ¬Έμ œκ°€ μ—†λ‹€. 이것이 κ΄€μ°°κ°€λŠ₯ν•˜κ±°λ‚˜ κ΄€μ°°λΆˆκ°€λŠ₯ν•œ 변이λ₯Ό κ΅¬λ³„ν•˜λŠ” 것이 ν•„μˆ˜μ μΈ μ΄μœ μ΄λ‹€. ν•¨μˆ˜μ— 객체λ₯Ό λ§Œλ“  λ‹€μŒ κ·Έ 객체λ₯Ό μ±„μšΈ ν•„μš”κ°€ μžˆλ‹€λ©΄, 맀우 λΉ„νš¨μœ¨μ  일뿐 μ•„λ‹ˆλΌ 변이λ₯Ό ν”Όν•˜κΈ°μ—” μ˜λ¦¬ν•˜μ§€ μ•Šλ‹€. 이 μŠ€λ ˆλ“œ λŠ” μ£Όμ œμ— λŒ€ν•œ 쒋은 글이닀.
  • spread operator, Array.prototype.concat, Array.prototype.slice, 기타 등등을 κΈ°μ–΅ν•˜λΌ. 이 것듀은 λͺ¨λ‘ λ°°μ—΄μ˜ 얕은 볡사본을 λ°˜ν™˜ν•œλ‹€. λ§Œμ•½ κΉŠμ€ 볡사λ₯Ό μ›ν•œλ‹€λ©΄ Lodash의 cloneDeep을 μ‚¬μš©ν•˜λΌ
  • λ˜ν•œ 원본 배열을 λ³€κ²½ν•˜λŠ” λŒ€μ‹  μƒˆ λ°°μ—΄ / 객체λ₯Ό λ°˜ν™˜ν•˜λ©΄ μ„±λŠ₯ μΈ‘λ©΄μ—μ„œ λΉ„μš©μ΄ 많이 λ“ λ‹€. (특히 κΉŠμ€ 볡사) 데이터 ꡬ쑰λ₯Ό λΆˆλ³€μœΌλ‘œ μœ μ§€ν•˜λŠ” 것은 λΉ„μš©μ΄ λ§Žμ΄λ“œλŠ” μž‘μ—…μ΄λ‹€.