Pass-by-value (๊ฐ์ ์ํ ์ ๋ฌ)
primitive type(์์ ํ์
)์์๋ '๊ฐ ๊ทธ๋๋ก' ์ ์ฅ / ํ ๋น๋๊ณ ๋ณต์ฌ๋์ด ์ ๋ฌ๋๋ค.
primitive type์ ๊ฐ์ด ํ๋ฒ ์ ํด์ง๋ฉด ๋ณ๊ฒฝํ ์ ์๊ณ ๊ฐ์ ๋ฐํ์์ ๋ฉ๋ชจ๋ฆฌ์ ์คํ ์์ญ์ ๊ณ ์ ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ์ ํ๊ณ ์ ์ฅ๋๋ค.
let x = 1;
JavaScript
๋ณต์ฌ
์์ ๊ฐ์ด Primitive type์ ๊ฐ์ง ๋ณ์ x๋ฅผ num์ด๋ผ๋ ์๋ก์ด ๋ณ์์ =๋ฅผ ์ฌ์ฉํด ํ ๋นํ๋ฉด, num์๋ x์ ๊ฐ์ด ๋ณต์ฌ(copy)๋๋ค.
JavaScript์์๋ ๋ชจ๋ function arguments๋ ํญ์ passed-by-value์ด๋ค.
์ฆ, function argument์ ๊ฐ์ ๋ณ๊ฒฝ์ํค๋๋ผ๋ function ์ธ๋ถ์ ๋ณ์์๋ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
Pass-by-reference (์ฐธ์กฐ์ ์ํ ์ ๋ฌ)
reference type์ ๋ณ์๋ ๋ณ์์ ๊ฐ์ฒด๊ฐ ๊ทธ๋๋ก ์ ์ฅ๋๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋์ด ์๋ '๋ฉ๋ชจ๋ฆฌ ์ฃผ์'์ธ ๊ฐ์ฒด์ ๋ํ '์ฐธ์กฐ ๊ฐ'์ด ์ ์ฅ
๋ฐ๋ผ์ ๋ณต์ฌํ ์ดํ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ์ด์ ์ ๊ฐ์๋ ์ํฅ์ ๋ฏธ์น๊ฒ ๋๋ค.
==(๋๋ฑ์ฐ์ฐ์) ===(์ผ์น์ฐ์ฐ์) ๋น๊ต ๊ฒฐ๊ณผ๊ฐ์ด ๋ค๋ฅผ ์ ์๋ ์์ ํ์
๊ณผ ๋ฌ๋ฆฌ ๊ฐ์ฒด ๋น๊ต์์๋ ๋์ผํ๊ฒ ์ ๋ฌ
ํ์ง๋ง ๋ฌด์กฐ๊ฑด ์ฐธ์กฐ ํ์
์ ๋๊ธด๋ค๊ณ ํด์ ์ ๋ถ passed by reference๋ ์๋๋ค.
function changeStuff(a, b, c)
{
a = a * 10;
b.item = "changed"; // b๊ฐ ์ฐธ์กฐํ๊ณ ์๋ ์ฃผ์์ item ๊ฐ ๋ณ๊ฒฝ
c = {item: "changed"}; // c์ ์๋ก์ด ๊ฐ์ฒด ์ฃผ์ ํ ๋น
}
var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};
changeStuff(num, obj1, obj2);
console.log(num); // 10
console.log(obj1.item); // changed
console.log(obj2.item); // unchanged
JavaScript
๋ณต์ฌ
์ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
num ๋ณ์๋ primitive type์ผ๋ก function argument๋ก ์ ๋ฌ ์ passed by value๊ฐ ์ด๋ฃจ์ด์ก๋ค. ๊ฐ๋ง ๋ณต์ฌํ์ผ๋ฏ๋ก ์ธ๋ถ ๋ณ์์ธ num์ ๊ฐ์ ๋ณํจ์์ด 10์ด๋ค.
obj1 ๋ ๊ฐ์ฒด๋ก passed by reference๊ฐ ์ด๋ฃจ์ด์ก๋ค. ์ฃผ์๊ฐ์ด ์ ๋ฌ๋์์ผ๋ฏ๋ก b๋ obj1๊ณผ ๊ฐ์ ๊ณณ์ ๊ฐ๋ฆฌํค๊ณ ์๋ค. b.item์ ๊ฒฐ๊ตญ obj1.item ์ด๋ฏ๋ก ๊ฐ์ฒด์ ๋ณํ๊ฐ ์ด๋ฃจ์ด์ง๊ฒ ๋๋ค.
obj2๋ ์ฃผ์๊ฐ์ด ์ ๋ฌ๋์์ง๋ง c = {item: 'changed'}์์ ์ฐธ์กฐํ๋ ์์น๊ฐ ์๋ ๋ณ์์ ํจ์ ๋ด์์ ์๋ก ์์ฑ๋ ๊ฐ์ฒด {item: 'changed'} ๋ฅผ ํ ๋นํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ obj2 ๊ฐ์ฒด์๋ ๋ณํ๊ฐ ์๋ค.
argument ์์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ์๋ argument์ ํ ๋นํ ๋ณ์์๋ ์ํฅ์ ๋ฏธ์น์ง ์์ง๋ง, ๋ณ์์ ๋ด๋ถ๋ฅผ ๋ณ๊ฒฝํ๊ฒ๋๋ฉด ์ธ๋ถ ๋ณ์์๋ ์ํฅ์ ๋ฏธ์น๊ฒ ๋๋ค.