javascript reference and copy variables - Lee-hyuna/33-js-concepts-kr GitHub Wiki

Javascript λ³€μˆ˜μ˜ μ°Έμ‘° 및 볡사

원문: https://hackernoon.com/javascript-reference-and-copy-variables-b0103074fdf0

각 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—λŠ” κ³ μœ ν•œ νŠΉμ„±μ΄ μžˆμ§€λ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ§Žμ€ νŠΉμ„±μ„ 가지고 μžˆλ‹€. ν•΄λ‹Ή ν¬μŠ€νŒ…μ€ 참쑰둜 ν• λ‹Ήλœ λ³€μˆ˜μ™€ 볡사에 μ˜ν•΄ ν• λ‹Ήλœ λ³€μˆ˜μ— λŒ€ν•΄ 이야기할 것이닀.

μ›μ‹œ νƒ€μž…(Primitive Value) vs 볡합 νƒ€μž…(Compound Value)

μš°μ„  μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ›μ‹œ νƒ€μž… 값듀을 μ‚΄νŽ΄λ³΄μž.

Primitive

  • null
  • undefined
  • String
  • Number
  • Boolean

Compound

  • Object
  • Array
  • Function

기술적으둜 μ›μ‹œ νƒ€μž…μ€ 항상 Pass-by-value(볡사)이며 볡합 νƒ€μž…μ€ Pass-by-reference(μ°Έμ‘°)이닀. 예λ₯Ό λ“€μ–΄λ³΄μž.

let person1 = 'Michael';
let person2 = person1;
person1 = 'John';

console.log(person1); // John
console.log(person2); // Michael

let birthYear1 = 1995;
let birthYear2 = birthYear1;
birthYear1++;

console.log(birthYear1); // 1995
console.log(birthYear2); // 1996

μœ„μ˜ μ˜ˆμ œλŠ” μ›μ‹œ νƒ€μž…μœΌλ‘œ 값을 λ³΅μ‚¬ν•˜κ³ , 볡사 λŒ€μƒμ΄λ˜λŠ” κ°’(person1, birthYear1)을 λ³€κ²½ν–ˆλ‹€. 볡사 λŒ€μƒμ΄ λ˜λŠ” 값을 λ³€κ²½ν•˜μ—¬λ„ λ³΅μ‚¬ν•œ κ°’μ—λŠ” 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ”λ‹€. κ·ΈλŸ¬λ‚˜ 볡합 νƒ€μž…μ˜ 경우, λ‹€μŒκ³Ό 같을 것이닀.

let inventory = ['banana', 'apple'];
let purchased = inventory;
inventory.push('strawberry');
purchased[1] = 'corn';

console.log(inventory); // ["banana", "corn", "strawberry"]
console.log(purchased); // ["banana", "corn", "strawberry"]

let person1 = { name: 'Vitor', birthYear: 1995 };
let person2 = person1;
person2.name = 'Eduardo';
person1.birthYear = 1992;

console.log(person1); // Object {name: "Eduardo", birthYear: 1992}
console.log(person2); // Object {name: "Eduardo", birthYear: 1992}

볡합 νƒ€μž…(Object, Array)λ₯Ό μ‚¬μš©ν•˜μ—¬ 볡사 λŒ€μƒμ΄ λ˜λŠ” κ°’(inventory, person1)을 λ³€κ²½ν•˜μ—¬λ„ λ³΅μ‚¬ν•œ κ°’(purchased, person2)에 영ν–₯을 미치고, κ·Έ λ°˜λŒ€μ˜ κ²½μš°μ—λ„ 영ν–₯을 미치고 μžˆλ‹€.

ν•˜μ§€λ§Œ μ–Έμ œλ‚˜ μ˜ˆμ™ΈλŠ” 있기 마련...

let inventory = ['banana', 'apple'];
let purchased = inventory;
inventory = ['pie', 'bacon', 'pizza'];
purchased[1] = 'corn';

console.log(inventory); // ["pie", "bacon", "pizza"]
console.log(purchased); // ["banana", "corn"]

let person1 = { name: 'Vitor', birthYear: 1995 };
let person2 = person1;
person1 = { name: 'Eduardo', birthYear: 1992 };

console.log(person1); // Object {name: "Eduardo", birthYear: 1992}
console.log(person2); // Object {name: "Vitor", birthYear: 1995}

μ™œ μœ„μ˜ 예제의 볡사 λŒ€μƒμ˜ κ°’κ³Ό λ³΅μ‚¬λœ 값은 μ„œλ‘œ 값이 λ‹€λ₯ΌκΉŒ? λΆ„λͺ… Object와 ArrayλŠ” μ°Έμ‘° 볡사가 λ˜λŠ” 값일텐데..?

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ‹€μ œλ‘œ μ°Έμ‘° 값을 λ³΅μ‚¬ν•˜κ³  있고, Object λ˜λŠ” Array의 속성(property)을 변경해도 μ°Έμ‘°λ₯Ό λ³€κ²½ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€. (μœ„μ˜ 예제의 purchased 값을 ν™•μΈν•˜μž)

ν•˜μ§€λ§Œ λ³€μˆ˜μ— μƒˆλ‘œμš΄ 값을 μ§€μ •ν•˜λ©΄ μ°Έμ‘° 자체λ₯Ό λ³€κ²½ν•˜κ³  μ›λž˜ Object/Array에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ”λ‹€! (μœ„μ˜ 예제의 inventory 값을 ν™•μΈν•˜μž)

μœ„ ν˜„μƒμ„ μ–΄λ–»κ²Œ μˆ˜μ •ν• κΉŒ?

원본 값에 λŒ€ν•œ 변경을 κ±±μ •ν•˜μ§€ μ•Šκ³  Object의 속성을 μ—…λ°μ΄νŠΈ ν•˜κ³  배열을 μˆ˜μ •ν•˜κ³  μ‹Άλ‹€κ³  κ°€μ •ν•΄λ³΄μž.

이 문제λ₯Ό ν•΄κ²°ν•˜λ €λ©΄ 볡사본을 λ§Œλ“€λ©΄ λœλ‹€! λ‹€μŒμ€ μ˜ˆμ œμ΄λ‹€. (ES6 λ²„μ „μ—μ„œλ§Œ μ‚¬μš©κ°€λŠ₯).

let inventory = ['banana', 'apple'];

// ES5 >> let purchased = inventory.slice(); // OR let purchased = [].concat(inventory);
// ES6 methods
let purchased = [...inventory]; // OR let purchased = Array.from(inventory); μƒˆλ‘œμš΄ κ°’μœΌλ‘œ 볡사

inventory.push('strawberry');
purchased[1] = 'corn';

console.log(inventory); // ["banana", "apple", "strawberry"]
console.log(purchased); // ["banana", "corn"]

let person1 = { name: 'Vitor', birthYear: 1995 };
// ES6
let person2 = Object.assign({}, person1); // μƒˆλ‘œμš΄ κ°’μœΌλ‘œ 볡사

person2.name = 'Eduardo';
person1.birthYear = 1992;

console.log(person1); // Object {name: "Vitor", birthYear: 1992}
console.log(person2); // Object {name: "Eduardo", birthYear: 1995}

ES6의 ...(spread operator)와 Object.assign λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ λ°°μ—΄κ³Ό 객체의 값을 λ³΅μ‚¬ν•˜μ˜€λ‹€.

이제 원본 값이 λ³€κ²½λ˜λŠ” 점은 κ±±μ •ν•  ν•„μš”κ°€ μ—†λ‹€! 두 개의 원본 값을 λ³΅μ‚¬ν–ˆλŠ”λ°, 원본 값이 변경될 경우 이 μ†”λ£¨μ…˜μ„ μ‚¬μš©ν•œλ‹€.

끝!

이 ν¬μŠ€νŒ…μ΄ λ‚΄κ°€ 이 사싀을 μ•Œμ•˜μ„ λ•Œ λ§ŒνΌμ΄λ‚˜ λ…μžλ“€μ—κ²Œ μœ μš©ν–ˆμœΌλ©΄ μ’‹κ² λ‹€! μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό 더 배우고 배운 것에 λŒ€ν•΄ 글을 μ“°λŠ” 것을 κ³„μ†ν•˜κ³  μžˆλ‹€. κ·ΈλŸ¬λ‹ˆ μ—¬κΈ° Medium와 νŠΈμœ„ν„°μ—μ„œ νŒ”λ‘œμž‰ ν•˜λŠ” 것을 μžŠμ§€ λ§μ•˜μœΌλ©΄ μ’‹κ² λ‹€!

μ’‹μ•„μš” λ²„νŠΌμ„ ν΄λ¦­ν•˜κ³  μžλ°”μŠ€ν¬λ¦½νŠΈλ‚˜ ν”Όλ“œλ°±μ— λŒ€ν•΄ μ•Œκ³  싢은 λ‚΄μš© μ•„λž˜μ˜ μ˜κ²¬μ„ μ–ΈκΈ‰ν•¨μœΌλ‘œμ¨ β€˜Recommend’λ₯Ό μ£ΌλŠ” 것이 μ’‹λ‹€λ©΄ 말이닀!

λ²ˆμ—­ ν›„κΈ°

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°μ΄ˆμ΄μ§€λ§Œ κ°œλ°œν•˜λ©΄μ„œ 가끔 κΉŒλ¨ΉλŠ” μ°Έμ‘° 볡사
  • λ‚΄μš©μ΄ μ•½κ°„ λΉˆμ•½ν•œ 것 κ°™μ§€λ§Œ κΈ°λ³Έ 적인 λ‚΄μš©μ€ λ“€μ–΄μžˆλ‹€.
⚠️ **GitHub.com Fallback** ⚠️