Explaining Value vs Reference in Javascript - Lee-hyuna/33-js-concepts-kr GitHub Wiki
(์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฌด์จ์ผ์ด ์ผ์ด๋๋์ง ๊ฐ๋จํ ์ดํด๋ณด์.)
์ด ๊ธฐ์ฌ๋ ์จ๋ผ์ธ ์ฝ์ค์ธ Step Up Your JS: A Comprehensive Guide to Intermediate JavaScript์์ ๊ฐ์ง๊ณ ์๋ค. ๋ํ์ ์ฝ๋ ๊ณต๊ฐ(๋์ดํฐ)๊ณผ ์จ๋ผ์ธ ํด์ฆ๋ฅผ ์ํด ๋ฌด๋ฃ๋ก ๋ณผ ์ ์๋ค. (์ฐธ๊ณ : ๋ฌด๋ฃ๋ก ๋ณผ ์ ์๋ ๋งํฌ)
์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ฐ์ ์ ๋ฌํ๋ Boolean
, null
, undefined
, String
, Number
5๊ฐ์ง ํ์
์ ๊ฐ์ง๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฅผ Primitive Type์ด๋ผํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฐธ์กฐ(Reference)์ ์ ๋ฌํ๋ Array
, Function
๊ทธ๋ฆฌ๊ณ Object
3๊ฐ์ง ํ์
์ ๊ฐ์ง๋ค. ์ด๊ฒ์ ๋ชจ๋ ๊ธฐ์ ์ ์ผ๋ก Object์ด๊ณ , ๊ทธ๋์ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ Object์ ๋ชจ์์ด๋ผ ์ธ๊ธํ๋ค.
๋ง์ฝ Primitive ํ์ ์ด ๋ณ์์ ํ ๋น๋๋ฉด, ํด๋น ๋ณ์๊ฐ primitive ๊ฐ์ ํฌํจํ ๋ณ์๋ก ์๊ฐํ ์ ์๋ค.
var x = 10;
var y = 'abc';
var z = null;
x
๋ 10
์ ํฌํจ, y
๋ 'abc'
๋ฅผ ํฌํจํ๋ค. ์ด ์์ด๋์ด๋ฅผ ํ๊ณ ํ ํ๊ธฐ ์ํด์ ์ฐ๋ฆฌ๋ ์ด ๋ณ์๋ค๊ณผ ๊ฐ๊ฐ์ ๊ฐ๋ค์ด ๋ฉ๋ชจ๋ฆฌ์์ ์ด๋ป๊ฒ ๋ณด์ด๋์ง์ ๋ํ ์ด๋ฏธ์ง๋ฅผ ์ ์งํ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ๋ =
์ ์ฌ์ฉํ์ฌ ์ด๋ค ๋ณ์์ ๋ค๋ฅธ ๋ณ์๋ฅผ ํ ๋นํ ๋, ์ฐ๋ฆฌ๋ ์๋ก์ด ๋ณ์์ ๊ฐ์ ๋ณต์ฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๊ฐ์ ๋ณต์ฌํ๋ค.
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'
๋ฅผ ํฌํจํ๋ค. ๊ทธ๋ค์ ๊ฐ์ด ๋ณต์ฌ ๋์๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ์ ๋ณ์์ ๊ฐ์ ๊ฐ์ง๋ค.
ํ๋๋ฅผ ๋ฐ๊พผ ๋ค๊ณ ํด์ ๋ค๋ฅธ ๊ฒ์ด ๋ฐ๋๋ ๊ฒ์ ์๋๋ค. ๋ณ์๋ค์ด ์๋ก ๊ด๊ณ๊ฐ ์๋ค๊ณ ์๊ฐํด์ผํ๋ค.
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'
์ด๊ฒ์ ํผ๋์ค๋ฝ๊ฒ ์ง๋ง, ์ฐธ๊ณ ๋๊น์ง ์ฝ์ด๋ผ. ์ผ๋จ ์ด๊ฒจ๋ด๋ฉด ์ฌ์ ๋ณด์ผ ๊ฒ์ด๋ค.
๊ธฐ๋ณธ ๊ฐ์ด ์๋ ํ ๋น๋ ๋ณ์์๋ ํด๋น ๊ฐ์ ๋ํ ์ฐธ์กฐ๊ฐ ์ ๊ณต๋๋ค. ๊ทธ ์ฐธ์กฐ๋ ๋ฉ๋ชจ๋ฆฌ์์ Object์ ์์น๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ค. ๋ณ์์๋ ์ค์ ๋ก ๊ฐ์ด ํฌํจ๋์ด ์์ง ์๋ค.
Object๋ ์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ์ ์ผ๋ถ ์์น์ ์์ฑ๋๋ค. arr = []
์ ์์ฑ ํ์ ๋, ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐฐ์ด์ ์์ฑํ๋ค. arr ๋ณ์๋ ๋ฐฐ์ด์ ์ฃผ์, ์์น๋ฅผ ๋ฐ๋๋ค.
์ฃผ์๊ฐ ์ซ์๋ ๋ฌธ์์ด ์ฒ๋ผ ๊ฐ์ผ๋ก ์ ๋ฌ๋๋ ์๋ก์ด ๋ฐ์ดํฐ ์ ํ์ด๋ผ๊ณ ๊ฐ์ ํด๋ณด์. ์ฃผ์๋ ์ฐธ์กฐ์ ์ํด ์ ๋ฌ๋๋ ๊ฐ์ ์์น, ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๋ฌธ์์ด์ด ๋ฐ์ดํ(''
๋๋ ""
)๋ก ํ๊ธฐ๋๋ ๊ฒ์ฒ๋ผ, ์ฃผ์๋ ํ์ดํ ๊ดํธ์ธ <>
๋ก ํ๊ธฐ๋๋ค.
์ฐธ์กฐ ํ์ ๋ณ์๋ฅผ ํ ๋นํ๊ณ ์ฌ์ฉํ ๋ ์์ฑํ๊ณ ๋ณด๋ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
1) var arr = [];
2) arr.push(1);
๋ฉ๋ชจ๋ฆฌ์์ 1, 2 ๋ผ์ธ์ ํํํ๋ฉด ์๋์ ๊ฐ๋ค.
์ด ๋ณ์ arr
์ ๊ฐ์ ํฌํจํ๊ณ , ์ฃผ์๋ ์ ์ ์์ ์ ์ํ๋ผ. ๋ฐฐ์ด์ ๋ฉ๋ชจ๋ฆฌ์์ ๋ณํ๋ค. ์ฐ๋ฆฌ๊ฐ ๊ฐ์ pushํ๋ ๊ฒ ์ฒ๋ผ ๊ฐ๊ฒ ํ๊ธฐ ์ํด์ arr
์ ์ฌ์ฉ ํ ๋, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ arr
์ ์์น๋ก ๊ฐ์ ๊ทธ ๊ณณ์ ์๋ ์ ์ฅ๋ ์ ๋ณด๋ก ์ผ์ ํ๊ฒ ํ๋ค.
์ฐธ์กฐ ์ ํ ๊ฐ, ์ฆ object์ =
์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๋ณ์์ ๋ณต์ฌํ ๋, ๊ทธ ๊ฐ์ ์ฃผ์๋ ์ค์ ๋ก primitive ์ฒ๋ผ ๋ณต์ฌ๋๋ ๊ฒ์ด๋ค. object๋ ๊ฐ ๋์ ์ฐธ์กฐ๋ก ๋ณต์ฌ๋๋ค.
var reference = [1];
var refCopy = reference;
์์ ์ฝ๋๋ ๋ฉ๋ชจ๋ฆฌ์์๋ ์๋์ ๊ฐ์ด ๋ณด์ฌ์ง๋ค.
๊ฐ ๊ฐ์ ๋ณ์๋ ์ง๊ธ ๊ฐ์ ๋ฐฐ์ด์ ์ฐธ์กฐ๋ฅผ ํฌํจํ๊ณ ์๋ค. ์ด ๋ป์ ๋ง์ฝ reference
๋ฅผ ๋ณ๊ฒฝํ๋ฉด retCopy
์์ ๋ค์๊ณผ ๊ฐ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ณผ ์ ์๋ค.
reference.push(2);
console.log(reference, refCopy); // -> [1, 2], [1, 2]
2
๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ pushํ๊ณ , reference
์ refCopy
๊ฐ ์ฌ์ฉ๋ ๋ ๊ฐ์ ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๊ณ ์๋ค.
๊ธฐ์ค์ด ๋๋ ๋ณ์๋ฅผ ์ฌํ ๋นํ๋ฉด ๊ธฐ์กด ์ฐธ์กฐ๊ฐ ๋์ฒด ๋๋ค.
var obj = { first: 'reference' };
์ด๊ฒ์ ๋ฉ๋ชจ๋ฆฌ์์
๋๋ฒ์งธ ๋ผ์ธ์ ์ถ๊ฐํ๋ฉด
var obj = { first: 'reference' };
obj = { second: 'ref2' }
์ฃผ์๋ obj
๋ณ๊ฒฝ์ฌํญ์ ์ํด ์ ์ฅ์ด ๋๋ค. first object๋ ์ฌ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๋ฉฐ, ๊ทธ ๋ค์ object๋ ๋์ผํ๋ค.
์์ ์ฃผ์ #234
์์ ๋ณด๋ฏ์ด object์ ๋ํ ์ฐธ์กฐ๊ฐ ๋จ์์์ง ์์ ๋, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ garbage collection์ ์คํํ ์ ์๋ค. ์ด ๊ฒ์ ๋จ์ง ํ๋ก๊ทธ๋๋จธ๊ฐ ๊ทธ object์ ๋ํ ๋ชจ๋ ์ฐธ์กฐ๋ฅผ ์์ด๋ฒ๋ ค์ ๊ทธ object๋ฅผ ๋ ์ด์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก, ์์ง์ ๊ณ์ํด์ ๋ฉ๋ชจ๋ฆฌ์์ ์์ ํ๊ฒ ์ญ์ ๋ฅผ ํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ {first:'reference'}
๋ ๋ ์ด์ ์ก์ธ์คํ ์ ์์ผ๋ฉฐ ์์ง์์ garbage collection์ ์ํด ์ฌ์ฉํ ์ ์๋ค.
์ผ์น ์ฐ์ฐ์ ==
๊ทธ๋ฆฌ๊ณ ===
์ ๊ฐ๊ณผ ํ์
, ์ฐธ์กฐ๋ฅผ ํ์ธํ ๋ ์ฌ์ฉํ๋ค.
๋ง์ฝ ๋ณ์๊ฐ ๊ฐ์ ์์ดํ
์ ์ฐธ์กฐ๋ฅผ ํฌํจํ๋ค๋ฉด, ๊ทธ ๋น๊ต์ ๊ฒฐ๊ณผ๋ true
์ด๋ค.
var arrRef = [โHi!โ];
var arrRef2 = arrRef;
console.log(arrRef === arrRef2); // -> true
๋ง์ฝ ๊ตฌ๋ณ์ด ๋๋ ojbect๋ผ๋ฉด ๋น๋ก ๋์ผํ porperty๋ค์ ํฌํจํ๊ณ ์๋๋ผ๋ ๋น๊ต ๊ฒฐ๊ณผ๋ false
์ด๋ค.
var arr1 = ['Hi!'];
var arr2 = ['Hi!'];
console.log(arr1 === arr2); // -> false
๋ง์ฝ ๋ ๊ฐ๊ฐ ๊ตฌ๋ณ์ด ๋๋ object๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ๊ทธ property๊ฐ ๊ฐ์์ง ์์๋ณด๋ ค๊ณ ํ๋ค๋ฉด, ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋๋ค string์ผ๋ก ๋ณํํ๊ณ ๋ ๋ค์ ๋น๊ต ํ๋ ๊ฒ์ด๋ค. ์ผ์น ์ฐ์ฐ์๊ฐ primitive์ ๋น๊ตํ ๋, ๋จ์ํ ๊ฐ์ด ๊ฐ์์ง ํ์ธํ๋ค.
var arr1str = JSON.stringify(arr1);
var arr2str = JSON.stringify(arr2);
console.log(arr1str === arr2str); // true
๋ ๋ค๋ฅธ ์ต์ ์ ojbect ์ฌ์ด๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ํํ์ฌ ๊ฐ ์์ฑ์ด ๋์ผํ์ง ํ์ธํ๋ ๊ฒ์ด๋ค.
ํจ์๋ฅผ ํตํด์ primitive ๊ฐ์ ์ ๋ฌํ ๋, ํจ์๋ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก ๋ณต์ฌํ๋ค.
์ด๊ฒ์ =
์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ์ฌ์ค์ ๊ฐ๋ค.
var hundred = 100;
var two = 2;
function multiply(x, y) {
// PAUSE
return x * y;
}
var twoHundred = multiply(hundred, two);
์์ ์์ ์์, hundred
์ ๊ฐ์ 100
์ด๋ค. hundred
๊ฐ multiply
๋ก ์ ๋ฌ๋์ด ๋ณ์ x
๊ฐ ๊ทธ ๊ฐ์ 100
์ผ๋ก ์ป๋๋ค. ์ด ๊ฐ์ ๋ง์น =
์ ์ฌ์ฉํ์ฌ ๊ฐ์ด ๋ณต์ฌ ๋์ด์ก๋ค. ๋ค์ ๋งํ์ง๋ง, hundred
์ ๊ฐ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค. multiply
ํจ์ ์์ PAUSE ์ฃผ์์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ์๊ฒผ๋์ง ๋ณด์ฌ์ฃผ๋ ์ค๋
์ท์ด ์๋ค. (Here is a snapshot of what the memory looks like right at the PAUSE comment line in multiply.)
์ฐ๋ฆฌ๋ ์ธ๋ถ scope์์ ์๋ฌด๋ฐ ์ํฅ์ ๋ฐ์ง ์๋ ํจ์๋ฅผ pure Function์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ํจ์๊ฐ primitive ๊ฐ๋ง์ ํ๋ผ๋ฏธํฐ๋ก ํ๊ณ , ๊ทธ ์ฃผ๋ณ scope์ ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ, ์ธ๋ถ scope์ ์ด๋ค ๊ฒ๋ ์ํฅ์ ์ค ์ ์๊ธฐ ๋๋ฌธ์ ์๋์ ์ผ๋ก pureํด์ง๋ค. ๋ด๋ถ์์ ์์ฑ๋ ๋ชจ๋ ๋ณ์๋ ํจ์๊ฐ ๋ฐํ๋๋ ์ฆ์ garbage-colledted ํด์ง๋ค.
์ฐธ๊ณ
- ๊ฐ๋น์ง์ฝ๋ ์
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด๋ป๊ฒ ์๋ํ๋๊ฐ: ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ + 4๊ฐ์ง ํํ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋์ฒ๋ฒ
๊ทธ๋ฌ๋ object๋ฅผ ๊ฐ์ ธ์ค๋ ํจ์๋ ์ฃผ๋ณ scope์ ์ํ๋ฅผ ๋ณํ์ํฌ ์ ์๋ค. ๋ง์ฝ ํจ์๊ฐ Array ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ ํด๋น ํจ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฐฐ์ด์ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ, ํด๋น ๋ฐฐ์ด์ ์ฐธ์กฐํ๋ ๋ฒ์์ ๋ณ์๋ ๋ณํ๋ฅผ ๊ฐ์งํ๋ค. ํจ์๊ฐ ๋ฐํ๋ ํ, ์ธ๋ถ scope์์ ๊ณ์ ์ ์ง๋๋ค. ์ด๊ฒ์ ์ถ์ ์ด ์ด๋ ค์ธ ์ ์๋ side effect๋ฅผ ์ผ์ผํฌ ์ ์๋ค.
๋ฐ๋ผ์ Array.map
๊ณผ Array.filter
๋ฅผ ํฌํจํ ๋ง์ native array ํจ์๋ pure function์ผ๋ก ์ฐ์ฌ์ง๋ค. ๊ทธ๋ค์ array ์ฐธ์กฐ๋ฅผ ๋ณต์ฌํ๊ณ , ์๋ณธ ๋์ ๋ณต์ฌ๋ณธ์ผ๋ก ์์
ํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์๋ณธ์ ๊ทธ๋๋ก, ์ธ๋ถ scope๋ ์ํฅ์ ๋ฐ์ง ์๊ณ , ์๋ก์ด array์ ๋ํ ์ฐธ์กฐ๊ฐ ๋ฐํ๋๋ค.
pure vs์ 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 }
์ด impure function์ ์ด๋ค object๋ฅผ ๊ฐ์ง๊ณ , object์ age
์ 25๋ก ๋ณ๊ฒฝํ๋ค. ์ด๋ ์ฐธ์กฐ์ ๋ฐ๋ผ ์์ฉํ๊ธฐ ๋๋ฌธ์ alex
object๋ฅผ ์ง์ ์ ์ผ๋ก ๋ณํ ์ํจ๋ค. person
๊ฐ์ฒด๋ฅผ ๋ฐํํ ๋, ์ ๋ฌ๋ object์ ์ ํํ ๋์ผํ object๋ฅผ ๋ฐํํ๋ค๋ ์ ์ ์ ์ํด๋ผ. alex
์ alexChanged
๋ (์ฝ๋๋ก ๋ดค์ ๋๋ changedAlex๊ฐ์๋ฐ ...์ฌํผ..)๋ ๋์ผํ ์ฐธ์กฐ๋ฅผ ํฌํจํ๊ณ ์๋ค. person
๋ณ์๋ฅผ ๋ฐํํ๊ณ ์ฐธ์กฐ๋ฅผ ์ ๋ณ์์ ์ ์ฅํ๋ ๊ฒ์ ์ค๋ณต์ด๋ค.
pureํ ํจ์๋ฅผ ๋ณด์.
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
๋ฅผ ์ฌ์ฉํ์ฌ object๋ฅผ ๋ฌธ์์ด๋ก ๋ฐํํ ๋ค์, ๋ค์ JSON.parse
๋ก object๋ฅผ ํ์ฑํ๋ค. ์ด ๋ณํ์ ์ํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์๋ก์ด ๋ณ์์ ์ ์ฅํจ์ผ๋ก์จ ์ฐ๋ฆฌ๋ ์๋ก์ด object๋ฅผ ๋ง๋ค์๋ค. ์๋์ object๋ฅผ ๋ฐ๋ณตํ๊ณ ๊ฐ๊ฐ์ ์์ฑ์ ์๋ก์ด ๊ฐ์ฒด์ ํ ๋นํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ง๋ง, ์ด ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค. ์๋ก์ด object๋ ์๋ object์ ๊ฐ์ property๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ๊ฐ ๋ถ๋ฆฌ๋ object์ด๋ค.
์ด ์๋ก์ด object์์ age
์์ฑ์ ๋ฐ๊พธ๋ฉด ์๋ณธ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ด์ pureํด์ก๋ค. ์ด๊ฒ์ ์์ ์ scope ๋ฐ์ ์ด๋ค object๋ ์ํฅ์ ์ค ์ ์๊ณ , ์ฌ์ง์ด ์ ๋ฌ๋ object๋ ์ํฅ์ ์ค ์ ์๋ค. ์๋ก์ด object๋ ๋ฐํ๋๊ณ ์๋ก์ด ๋ณ์์ ์ ์ฅ ๋์ด์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ ์ด์ scope์ ํฌํจ๋์ง ์๊ธฐ ๋๋ฌธ์ ํจ์๊ฐ ์๋ฃ๋๋ฉด garbage collected๋์ด ์ง๋ค.
Value์ reference๋ ์ฝ๋ฉ ์ธํฐ๋ทฐ์์ ์ํ์ด ๋์ด์ง ๊ฐ๋ ์ด๋ค. ์๊ธฐ์์ ๋ฌด์์ด ๊ธฐ๋ก์ด ๋์๋์ง ์ค์ค๋ก ์์๋ด๋๋ก ๋ ธ๋ ฅํด๋ณด๋ผ.
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); // -> ?
์ด ํจ์๋ ๋จผ์ ์ ๋ฌ๋ ์๋์ object์ ๋ํ age
property๋ฅผ ๋ณ๊ฒฝํ๋ค. ๊ทธ ๋ค์ ๋ณ์๋ฅผ ์ object์ ์ฌํ ๋นํ์ฌ object๋ฅผ ๋ฐํํ๋ค. ์ฌ๊ธฐ ๋ object๊ฐ logout๋ ๋ด์ฉ์ด ์๋ค.
console.log(personObj1); // -> { name: 'Alex', age: 25 }
console.log(personObj2); // -> { name: 'John', age: 50 }
ํจ์ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํ ํ ๋น์ =
์ผ๋ก ํ ๋น ๋๋ ๊ฒ๊ณผ ๋์ผํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํ๋ผ. ํจ์์์ person
๋ณ์๋ personObj1
์ ์ฐธ์กฐํ๋ ๊ฒ์ ํฌํจํ๊ณ ์๋ค. ๊ทธ๋์ ์ฒ์์๋ ๊ทธ object์ ์ง์ ์ ์ฉ์ด ๋๋ค. ์ผ๋จ person
์ ์๋ก์ด object์ ์ฌํ ๋นํ๋ฉด ์๋ object์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
์ด๋ฌํ ์ฌํ ๋น์ personObj1
์ด ์ธ๋ถ scope์์ ๊ฐ๋ฆฌํค๋ object๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค. 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
์ ๋ ์ด์ ๊ทธ scope์ ์์ง ์๋ค๋ ๊ฒ์ด๋ค.
โโโโโโโโ
๋ง์ฝ ์ด๊ฒ์ด ์ ์ฉํ๋ค๋ฉด, ๊ธ์ด์ด์ ์ํ๋ค์ ํ์ธํด...
๋ฒ์ญ ์๋ณธ URL : https://codeburst.io/explaining-value-vs-reference-in-javascript-647a975e12a0