GitHub์ ์๋ 33 Concepts Every JavaScript Developer Should Know ๋ผ๋ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ด์ฉ ์ค ๊ณต๋ถํ๊ณ ์ถ์ ์ํฐํด์ ๋ด๊ฐ ์ ๋ฆฌํ ๊ฒธ ๊ธฐ์ตํ ๊ฒธ ์์ฑํ๋ ๋ฒ์ญ๊ธ์ด๋ค. 33๊ฐ์ง ์ค ์ธ ๋ฒ์งธ์ธ ๊ธฐ๋ณธํ๊ณผ ์ฐธ์กฐํ(Value Types and Reference Types)์ ๊ด๋ จ๋ ๋ด์ฉ์ด๋ค.
โป ๋ด๋ณด๋ด๋ฒ(๋ด๊ฐ ๋ณด๋ ค๊ณ ๋ด๊ฐ ๋ฒ์ญํ): ์์ด ์ ๊ณต์๋ ํด์ธ ์ ํํ๋ ์๋๊ธฐ์ ๋ฒ์ญ์๋ ์์ญ, ์ค์ญ, ๊ตฌ๊ธ ๋ฒ์ญ์ด ๋ฌด์ํ ๋ง์ ์ ์์ผ๋ฉฐ, ์คํ๋ ๋ง์ ์ ์๋ค. ์ ํํ ๋ด์ฉ์ ์๋ฌธ์ ์ง์ ์ดํด๋ณด๊ฑฐ๋ ๋ค๋ฅธ ์ ๋ณด๋ค์ ๋ ์ฐพ์๋ณด๋ ๊ฒ์ ์ถ์ฒํ๋ค.
(ํ์ง๋ง ๋๊ธ ํผ๋๋ฐฑ๋ ํ์ํฉ๋๋ค๐ )
์ด๋ฒ์ ๊ณ ๋ฅธ ์ํฐํด์ Arnav Aggarwal ๋์ด ์์ฑํ์ Explaining Value vs. Reference in Javascript ์ด๋ค. ์ค๊ฐ์ค๊ฐ ์์ ๋ค์ด ๊ฐ๋
์ก๊ธฐ ์์ฃผ ์ข์๋ค. ๋ด์ฉ ์ค๊ฐ์ค๊ฐ๐ค์ด ์์ด์ฝ์ด ๋ณด์ธ๋ค๋ฉด ๋ณธ๋ฌธ์ ๋์ ์์ง ์์ ๋ฒ์ญํ๋ฉฐ ์ถ๊ฐํ ๋ง์ด๋ค.
(Primitive type์ ๊ธฐ๋ณธํ์ผ๋ก primitive value๋ ์์ ๊ฐ์ผ๋ก ๋ฒ์ญํ์๋ค.)
์ด ์ํฐํด์ ๋์ ์จ๋ผ์ธ ์ฝ์ค์ธ Step Up Your JS: A Comprehensive Guid to Intermediate JavaScript์์ ๋ฐ์ทํ๋ค. ์ด๊ณณ์์ ์์ ๋กญ๊ฒ ์ธํฐ๋ํฐ๋ธ ์ฝ๋ ํ๋ ์ด๊ทธ๋ผ์ด๋์ ์จ๋ผ์ธ ํด์ฆ๋ฅผ ๋ณด๋ผ.
์๋ฐ์คํฌ๋ฆฝํธ๋ 5๊ฐ์ ๊ฐ์ผ๋ก ์ ๋ฌ๋๋ ๋ฐ์ดํฐ ํ์ : Boolean, null, undefined, String, Number๊ฐ ์๋ค. ์ฐ๋ฆฌ๋ ์ด๋ค์ ๊ธฐ๋ณธํ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ 3๊ฐ์ ์ฐธ์กฐ๋ก ์ ๋ฌ๋๋ ๋ฐ์ดํฐ ํ์ : Array, Function, Object๊ฐ ์๋ค. ์ด๋ค์ ๊ธฐ์ ์ ์ผ๋ก๋ ๋ชจ๋ ๊ฐ์ฒด์ด๊ณ , ๊ทธ๋์ ์ด์นญํ์ฌ ๊ฐ์ฒด๋ผ๊ณ ํ๋ค.
๊ธฐ๋ณธํ
๊ธฐ๋ณธํ์ด ๋ณ์์ ํ ๋น๋ ๊ฒฝ์ฐ, ์ฐ๋ฆฌ๋ ๊ทธ ๋ณ์๊ฐ ์์ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ์๊ฐํ ์ ์๋ค.
var x = 10;
var y = 'abc';
var z = null;
x๋ 10์ ๊ฐ์ง๊ณ ์๋ค. y๋ 'abc'๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ด ๊ฐ๋ ์ ๊ตณํ๊ธฐ ์ํด์, ์ด ๋ณ์๋ค๊ณผ ๊ฐ๊ฐ์ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ์์ ์ด๋ป๊ฒ ๋ณด์ด๋์ง์ ์ด๋ฏธ์ง๋ฅผ ์ ์ง(maintain)ํ ๊ฒ์ด๋ค.
์ด๋ฌํ ๋ณ์๋ค์ ๋ค๋ฅธ ๋ณ์์ ํ ๋นํ ๋ '='๋ฅผ ์ฌ์ฉํ๊ณ ๊ฐ์ ์๋ก์ด ๋ณ์๋ก ๋ณต์ฌํ๋ค. ๊ทธ๋ค์ ๊ฐ์ผ๋ก ๋ณต์ฌ๊ฐ ๋๋ค.
var x = 10;
var y = 'abc';
var a = x;
var b = y;
console.log(x, y, a, b); // -> 10, 'abc', 10, 'abc'
a์ x ๋ชจ๋ 10์ ๊ฐ์ง๊ณ ์๋ค. b์ y ๋ชจ๋ 'abc'๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๊ทธ๋ค์ ๊ฐ ์์ฒด๊ฐ ๋ณต์ฌ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ณ๊ฐ์ด๋ค.
ํ๋์ ๊ฐ์ด ๋ฐ๋๋ค๊ณ ๋ค๋ฅธ ๊ฒ๋ ๋ฐ๋์ง ์๋๋ค. (๐ค:x๊ฐ ๋ฐ๋๋ค๊ณ a๊ฐ ๋ฐ๋๊ฑฐ๋, b๊ฐ ๋ฐ๋๋ค๊ณ y๊ฐ ๋ฐ๋์ง ์์.) ๋ณ์๋ ์๋ก์ ๋ํด ์๋ฌด๋ฐ ๊ด๊ณ๊ฐ ์๋ค๊ณ ์๊ฐํ๋ผ.
var x = 10;
var y = 'abc';
var a = x;
var b = y;
a = 5;
b = 'def';
console.log(x, y, a, b); // -> 10, 'abc', 5, 'def'
๊ฐ์ฒด
ํผ๋์ค๋ฌ์ธ ์๋ ์์ง๋ง, ๋์ ํจ๊ป ์ฐธ๊ณ ์ฝ์ด๋ณด์. ์ผ๋จ ๋ค ์ฝ์ด๋ณด๋ฉด ์ฝ๊ฒ ๋๊ปด์ง ๊ฒ์ด๋ค.
์์ ๊ฐ์ด ์๋ ๊ฐ์ด ํ ๋น๋ ๋ณ์๋ ํด๋น ๊ฐ์ ๋ํ ์ฐธ์กฐ๊ฐ ์ ๊ณต๋ ๊ฒ์ด๋ค. ๊ทธ ์ฐธ์กฐ๋ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ฒด์ ์์น๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๋ณ์๋ ์ค์ ๋ก ๊ฐ์ ๊ฐ์ง๊ณ ์์ง๋ ์๋ค.
๊ฐ์ฒด๋ ์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ค ์ฅ์์ ์์ฑ์ด ๋๋ค. arr = []๋ผ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด, ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฐ์ด์ ํ๋ ์์ฑํ ๊ฒ์ด๋ค. ๋ณ์ arr๊ฐ ๋ฐ๋ ๊ฒ์ ์ฃผ์ ์ฆ ๋ฐฐ์ด์ ์์น์ด๋ค.
address๊ฐ ๊ฐ์ผ๋ก ์ ๋ฌ๋ฐ๋ ์๋ก์ด ๋ฐ์ดํฐ ํ์ ์ด๋ผ๊ณ ์๊ฐํด๋ณด์. number๋ string๊ฐ์ด ๋ง์ด๋ค. address๋ ์ฐธ์กฐ๋ก ์ ๋ฌ๋๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ด ์์น๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๋ฌธ์์ด์ด ๋ฐ์ดํ(''๋ "")๋ก ํ์๋๋ ๊ฒ์ฒ๋ผ ์ฃผ์๋ ํ์ดํ ๊ดํธ, <>๋ก ํ์๋๋ค.
์ฐธ์กฐํ ๋ณ์์ ํ ๋นํ๊ณ ์ฌ์ฉํ ๋ ์์ฑํ๊ณ ๋ณด๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ๋ค:
1) var arr = [];
2) arr.push(1);
์์ ์ฒซ ๋ฒ์งธ์ ๋ ๋ฒ์งธ ์ค์ ๋ฉ๋ชจ๋ฆฌ์์ ํํํ๋ ๋ค์๊ณผ ๊ฐ๋ค:
1.
2.
arr ๋ณ์์ ๋ด๊ธด ๊ฐ(value)๊ณผ ์ฃผ์(address)๋ ๊ณ ์ ๋์ด ์๋ค. ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ฐฐ์ด์ด ๋ณ๊ฒฝ๋๋ค. arr๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฌด์ธ๊ฐ๋ฅผ ํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ arr์ ์์น์ ๊ฐ์ ๊ทธ๊ณณ์ ์ ์ฅ๋ ์ ๋ณด๋ก ์์ ํ๋ค.
์ฐธ์กฐ์ ์ํ ํ ๋น
์ฐธ์กฐํ์ ๊ฐ, ์ฆ ๊ฐ์ฒด๊ฐ '='๋ฅผ ์ฌ์ฉํด์ ๋ค๋ฅธ ๋ณ์๋ก ๋ณต์ฌ๋๋ฉด ํด๋น ๊ฐ์ ์ฃผ์๋ ๋ง์น ์์ ๊ฐ์ธ ๊ฒ์ฒ๋ผ ๋ณต์ฌ๋์ด ๋์ด๊ฐ๋ค. ๊ฐ์ฒด๋ ๊ฐ ๋์ ์ฐธ์กฐ๋ก ๋ณต์ฌ๋๋ค.
var reference = [1];
var refCopy = reference;
์์ ์ฝ๋๋ ๋ฉ๋ชจ๋ฆฌ์์ ์๋์ ๊ฐ์ด ๋ณด์ธ๋ค.
๊ฐ ๋ณ์๋ ๋์ผ ๋ฐฐ์ด์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ๊ณ ์๋ค. ์ฆ reference, refCopy๋ฅผ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ ํด๋น ๋ณ๊ฒฝ ์ฌํญ์ ๋ณผ ์ ์๋ค:
reference.push(2);
console.log(reference, refCopy); // -> [1, 2], [1, 2]
2๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฐ์ด์ ์ถ๊ฐํ๋ค. reference์ refCopy๋ฅผ ์ฌ์ฉํ ๋, ๊ฐ์ ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๊ณ ์๋ค.
์ฐธ์กฐ ์ฌํ ๋น
์ฐธ์กฐ ๋ณ์๋ฅผ ์ฌํ ๋นํ๋ ๊ฒ์ ์ด์ ์ฐธ์กฐ๊ฐ ๋์ฒด๋๋ค.
var obj = { first: 'reference' };
๋ฉ๋ชจ๋ฆฌ ๋ด:
๋ ๋ฒ์งธ ๋ผ์ธ์ ์ถ๊ฐํ๋ฉด:
var obj = { first: 'reference' };
obj = { second: 'ref2' }
obj์ ์ ์ฅ๋ ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋๋ค. ์ฒซ ๋ฒ์งธ ๊ฐ์ฒด๋ ์ฌ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๊ณ ๋ค์ ๊ฐ์ฒด๋ ๋ง์ฐฌ๊ฐ์ง๋ค.
์์ #234์ ๊ฐ์ด ๋จ์์๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ด ์์ผ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ํํ ์ ์๋ค. ์ด๊ฒ์ ํ๋ก๊ทธ๋๋จธ๊ฐ ํด๋น ๊ฐ์ฒด์ ๋ํ ๋ชจ๋ ์ฐธ์กฐ๋ฅผ ์์๊ณ , ํด๋น ๊ฐ์ฒด๋ฅผ ๋ ์ด์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์์ง์ ๊ทธ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ก๋ถํฐ ์์ ํ๊ฒ ์ญ์ ํ ์ ์๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ, ๊ฐ์ฒด {first: 'reference'}๋ ๋ ์ด์ ์ ๊ทผ ๋ถ๊ฐ๋ฅํ๊ณ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ํด ์์ง์ ์ฌ์ฉํ ์ ์๋ค.
==์ ===
๋๋ฑ ์ฐ์ฐ์ ==์ ===๊ฐ ์ฐธ์กฐํ ๋ณ์์ ์ฌ์ฉ๋ ๋, ๊ทธ๋ค์ ์ฐธ์กฐ๋ฅผ ํ์ธํ๋ค. ๋ณ์๊ฐ ๋์ผํ ํญ๋ชฉ์ ๋ํด ์ฐธ์กฐ๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด, ๋น๊ต์ ๋ํ ๊ฒฐ๊ณผ๋ true๊ฐ ๋๋ค.
var arrRef = [’Hi!’];
var arrRef2 = arrRef;
console.log(arrRef === arrRef2); // -> true
๋ง์ฝ ๊ทธ๋ค์ด ๋ณ๊ฐ์ ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ, ๋์ผํ ์์ฑ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ํ์ฌ๋ ๋น๊ต์ ๊ฒฐ๊ณผ๋ false ์ผ ๊ฒ์ด๋ค.
var arr1 = ['Hi!'];
var arr2 = ['Hi!'];
console.log(arr1 === arr2); // -> false
๋ ๊ฐ์ ๋ณ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๊ณ ๊ทธ๋ค์ ์์ฑ์ด ๊ฐ์์ง๋ฅผ ๋ณด๋ ค๋ฉด, ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ฒด ๋ชจ๋ ๋ฌธ์์ด๋ก ๋ณ๊ฒฝํ๊ณ ๋ฌธ์์ด๋ค์ ๋น๊ตํ๋ ๊ฒ์ด๋ค. ๋๋ฑ ์ฐ์ฐ์๊ฐ ๊ธฐ๋ณธํ์ ๋น๊ตํ ๋ ๋จ์ํ ๊ฐ์ด ๊ฐ์์ง๋ฅผ ํ์ธํ๋ค.
var arr1str = JSON.stringify(arr1);
var arr2str = JSON.stringify(arr2);
console.log(arr1str === arr2str); // true
๋ค๋ฅธ ์ต์ ์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณต๋ฌธ์ ๋๋ฉด์ ๊ฐ ์์ฑ์ด ๊ฐ์์ง๋ฅผ ํ์ธํ๋ ๊ฒ์ผ ๊ฒ์ด๋ค.
ํจ์๋ฅผ ํตํ ํ๋ผ๋ฏธํฐ ์ ๋ฌ
์์ ๊ฐ์ ํจ์์ ์ ๋ฌํ ๋, ํจ์๋ ์์ ์ ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ๋ณต์ฌํ๋ค. '='๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ์ฌ์ค์ ๋์ผํ๋ค.
var hundred = 100;
var two = 2;
function multiply(x, y) {
// PAUSE
return x * y;
}
var twoHundred = multiply(hundred, two);
์์ ์์ ์์ hundred์ 100์ ์ฃผ์๋ค. multiply๋ก hundred๋ฅผ ๋๊ฒจ์ฃผ๋ฉด ๋ณ์ x๋ ๊ทธ ๊ฐ 100์ ๋ฐ๋๋ค. '=' ํ ๋น์ ์ฌ์ฉํ ๊ฒ์ฒ๋ผ ๊ฐ์ด ๋ณต์ฌ๋๋ค. ๋ค์, hundred์ ๊ฐ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค. ์ฌ๊ธฐ multiply์ PAUSE ์ฃผ์์์ ๋ฉ์ถ์์ ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ๋ณด์ด๋์ง์ ๋ํ ์ค๋ ์ท์ด ์๋ค.
์์ ํจ์
์ธ๋ถ ์ค์ฝํ์ ์ํฅ์ ์ฃผ์ง ์๋ ํจ์๋ฅผ ์์ ํจ์๋ผ๊ณ ๋ถ๋ฅธ๋ค. ํจ์๊ฐ ์์ ๊ฐ๋ง ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๊ณ ์ฃผ๋ณ ์ค์ฝํ์์ ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ ์ธ๋ถ ์ค์ฝํ์ ์ด๋ค ๊ฒ๋ ์ํฅ์ ๋ฏธ์น์ง ์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์์ํ๋ค. ๋ด๋ถ์์ ์์ฑ๋ ๋ชจ๋ ๋ณ์๋ ํจ์๊ฐ ๋ฐํ๋์๋ง์ ๊ฐ๋น์ง ์ปฌ๋ ํธ ๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ ํจ์๋ ์ฃผ๋ณ ์ค์ฝํ์ ์ํ๋ฅผ ๋ณํํ ์ ์๋ค. ํ ํจ์๊ฐ ํ๋์ ๋ฐฐ์ด ์ฐธ์กฐ๋ฅผ ๊ฐ์ ธ์์ ๊ฐ๋ฆฌํค๋ ๋ฐฐ์ด์ ์์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ, ์ฃผ๋ณ ์ค์ฝํ์ ํด๋น ๋ฐฐ์ด์ ์ฐธ์กฐํ๋ ๋ณ์์์๋ ํด๋น ๋ณ๊ฒฝ์ฌํญ์ ๋ณผ ์ ์๋ค. ํจ์๊ฐ ๋ฐํ๋๊ณ ๋ ํ์ ์ธ๋ถ ์ค์ฝํ์์ ๋ณ๊ฒฝ์ฌํญ์ ์ ์ง๋๋ค. ์ด๊ฒ์ ์ถ์ ํ๊ธฐ ์ด๋ ค์ด ์์น ์๋ ๋ถ์์ฉ์ ์ผ๊ธฐํ ์ ์๋ค.
Array.map, Array.filter๋ฅผ ํฌํจํ ๋ง์ ๊ธฐ๋ณธ ๋ฐฐ์ด ํจ์๋ค์ ์์ ํจ์๋ก ์์ฑ๋๋ค. ์ด๋ฌํ ํจ์๋ค์ ๋ฐฐ์ด ์ฐธ์กฐ๋ฅผ ๊ฐ์ ธ์์ ๋ด๋ถ์ ์ผ๋ก ๋ฐฐ์ด์ ๋ณต์ฌํ๊ณ ์๋ ํจ์ ๋์ ๋ณต์ฌํ ํจ์๋ฅผ ์ฌ์ฉํ๋ค. ์ด๊ฒ์ ์๋ณธ ํจ์๊ฐ ๋ณ๊ฒฝ๋์ง ์๊ฒ ํด ์ฃผ๊ณ , ์ธ๋ถ ์ค์ฝํ์๋ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉฐ ์๋ก์ด ๋ฐฐ์ด์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ฐํํ๋ค.
์์ ํจ์์ ๋น์์(impure) ํจ์์ ์์๋ฅผ ์ดํด๋ณด์ (๐ค: impure function์ ๋ํ ์ฉ์ด๋ฅผ ์ฐพ์ง ๋ชปํ ๊ด๊ณ๋ก ๋น์์๋ก ์์ฑํจ.)
function changeAgeImpure(person) {
person.age = 25;
return person;
}
var alex = {
name: 'Alex',
age: 30
};
var changedAlex = changeAgeImpure(alex);
console.log(alex); // -> { name: 'Alex', age: 25 }
console.log(changedAlex); // -> { name: 'Alex', age: 25 }
์ด ๋น์์ ํจ์๋ ๊ฐ์ฒด๋ฅผ ๋ฐ์ age ์์ฑ์ 25๋ก ๋ณ๊ฒฝํ๋ค. ๋ฐ์ ์ฐธ์กฐ์ ์ํฅ์ ์ฃผ๊ธฐ ๋๋ฌธ์ ๊ณง๋ฐ๋ก alex ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ค. person ๊ฐ์ฒด๋ฅผ ๋ฐํํ ๋ ์ ๋ฌ๋ฐ์ ๋์ผํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒ์ ์ฃผ๋ชฉํ๋ผ. alex์ alexChanged๋ ๋์ผํ ์ฐธ์กฐ๋ฅผ ๊ฐ๊ณ ์๋ค. person ๋ณ์๋ฅผ ๋ฐํํ๊ณ ์๋ก์ด ๋ณ์์ ํด๋น ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ ์ค๋ณต๋๋ค.
์์ ํจ์๋ฅผ ์ดํด๋ณด์
function changeAgePure(person) {
var newPersonObj = JSON.parse(JSON.stringify(person));
newPersonObj.age = 25;
return newPersonObj;
}
var alex = {
name: 'Alex',
age: 30
};
var alexChanged = changeAgePure(alex);
console.log(alex); // -> { name: 'Alex', age: 30 }
console.log(alexChanged); // -> { name: 'Alex', age: 25 }
์ด ํจ์์์ JSON.stringify๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฌ๋ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ๊ณ JSON.parse๋ก ๊ฐ์ฒด๋ก ๋ค์ ํ์ฑ ํ๋ค. ์ด๋ฌํ ๋ณํ์ ์ํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์๋ก์ด ๋ณ์์ ์ ์ฅํ์ฌ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ๊ทธ๋ฐ์๋ ์ ๊ฐ์ฒด๋ฅผ ๋ฃจํ๋ฅผ ๋๋ฉด์ ๊ฐ ์์ฑ์ ์๋ก์ด ๊ฐ์ฒด์ ํ ๋นํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ๋ ์์ง๋ง ์์ ๋ฐฉ๋ฒ์ด ์ ์ผ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด๋ค. ์๋ก์ด ๊ฐ์ฒด๋ ์๋ณธ๊ณผ ๊ฐ์ ์์ฑ๋ค์ ๊ฐ์ง๊ณ ์์ง๋ง ๋ฉ๋ชจ๋ฆฌ์์๋ ๋ณ๊ฐ์ ๊ฐ์ฒด์ด๋ค.
age ์์ฑ์ ์๋ก์ด ๊ฐ์ฒด์์ ๋ณ๊ฒฝํ ๋, ์๋ณธ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค. ์ด ํจ์๋ ์์ํ๋ค. ์์ ์ ์ค์ฝํ ๋ฐ์ ์๋ ์ด๋ค ๊ฐ์ฑ์๋ ์ํฅ์ ์ค ์ ์๋๋ฐ ์ฌ์ง์ด ์ ๋ฌ๋ฐ์ ๊ฐ์ฒด์๋ ์ํฅ์ ์ค ์ ์๋ค. ์๋ก์ด ๊ฐ์ฒด๋ ๋ฐํ๋๊ณ ์๋ก์ด ๋ณ์์ ์ ์ฅ๋์ด์ผ ํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ํจ์๊ฐ ์ข ๋ฃ๋ ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์ํด ์์ง๋์ด ๊ฐ์ฒด๋ ๋ ์ด์ ์ค์ฝํ์ ๋ ์ด์ ์กด์ฌํ์ง ์๋๋ค.
์ค์ค๋ก ์ ๊ฒํด๋ณด๊ธฐ
๊ฐ vs. ์ฐธ์กฐ๋ ์ฝ๋ฉ ์ธํฐ๋ทฐ์์ ์์ฃผ ๋์ค๋ ๊ฐ๋ ์ด๋ค. ์ฌ๊ธฐ์ ๋ฌด์์ด ๋ก๊ทธ ๋์ด ์ถ๋ ฅ๋๋์ง ์ค์ค๋ก ์๊ฐํด๋ณด๋ผ.
function changeAgeAndReference(person) {
person.age = 25;
person = {
name: 'John',
age: 50
};
return person;
}
var personObj1 = {
name: 'Alex',
age: 30
};
var personObj2 = changeAgeAndReference(personObj1);
console.log(personObj1); // -> ?
console.log(personObj2); // -> ?
ํจ์๋ ์ ์ผ ๋จผ์ ์ ๋ฌ๋ฐ์ ์๋ณธ ๊ฐ์ฒด์ age ์์ฑ์ ๋ณ๊ฒฝํ๋ค. ๊ทธ ํ ๋ณ์์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์ฌํ ๋นํ์ฌ ๊ทธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ์ฌ๊ธฐ ๋ ๊ฐ์ฒด๊ฐ ๋ฌด์์ ์ถ๋ ฅํ๋์ง์ ๋ํ ๊ฒฐ๊ณผ์ด๋ค.
console.log(personObj1); // -> { name: 'Alex', age: 25 }
console.log(personObj2); // -> { name: 'John', age: 50 }
ํจ์ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ํ๋ ํ ๋น์ ๊ธฐ๋ณธ์ ์ผ๋ก '='๋ก ํ ๋นํ๋ ๊ฒ๊ณผ ๋์ผํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํ๋ผ. ํจ์ ๋ด์ person ๋ณ์๋ personObj1์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋ฐ๋ผ์ ์ฒ์์๋ ํด๋น ๊ฐ์ฒด์ ์ง์ ์์ฉํ๋ค. (๐ค: person ๋ณ์์๋ personObj1์ ๋ํ ์ฐธ์กฐ๊ฐ์ด ๋ค์ด์๊ธฐ ๋๋ฌธ์ person.age = 25์ ๋ํด์ personObj1์ ์ง์ age ์์ฑ์ด ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋งํ๋ ๊ฒ ๊ฐ๋ค.) person์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์ฌํ ๋นํ๋ฉด, person ๋ณ์๋ ์๋ณธ ๊ฐ์ฒด์ ๋ํด ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
์ด ์ฌํ ๋น์ personObj1์ด ์ธ๋ถ ์ค์ฝํ์์ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค. person์ ์ฌ ํ ๋น๋์๊ธฐ ๋๋ฌธ์ ์๋ก์ด ์ฐธ์กฐ๋ฅผ ๊ฐ์ง ์ด ์ฌํ ๋น์ผ๋ก personObj1์ด ๋ณ๊ฒฝ๋์ง๋ ์๋๋ค.
์ ๋ธ๋ก์ ์ฝ๋์ ํด๋นํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด๋ค:
var personObj1 = {
name: 'Alex',
age: 30
};
var person = personObj1;
person.age = 25;
person = {
name: 'john',
age: 50
};
var personObj2 = person;
console.log(personObj1); // -> { name: 'Alex', age: 25 }
console.log(personObj2); // -> { name: 'John', age: '50' }
ํจ์๋ฅผ ์ฌ์ฉํ ๋์์ ํ ๊ฐ์ง ์ฐจ์ด์ ์, person์ ํจ์๊ฐ ์ข ๋ฃ๋๋ฉด ๋ ์ด์ ์ค์ฝํ์ ์กด์ฌํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค.