말 그대로 값 자체가 복사되는 것을 의미한다. JS에서는 원시 데이터(숫자, 문자열 등)의 경우 값의 복사가 일어나며, 복사된 값은 원본과 독립적으로 동작한다.
e.g. 변수 복사
let a = 5;
let b = a;
b = 10;
console.log(a); // 5 → 원본 불변
console.log(b); // 10
e.g. 함수 인자 전달
function exchange(a, b) {
let temp = a;
a = b;
b = temp;
return `a는 ${a} 그리고 b는 ${b}`;
}
let x = 1;
let y = 2;
exchange(x, y);
console.log(`x: ${x}, y: ${y}`); // x: 1, y: 2
// x, y는 원시값이므로 값이 복사되어 전달된다.
// 따라서 함수 내부에서 a, b를 바꿔도 원본 x, y에는 영향이 없다.
JS에서 객체를 변수에 담거나 함수에 전달할 때는 객체 자체가 아니라 객체가 저장된 메모리 주소(참조값)가 복사된다. 이를 Call by Sharing이라고 한다.
흔히 Call by Reference라고 부르기도 하지만, 이는 정확한 표현이 아니다. 진짜 Call by Reference라면 함수 안에서 매개변수를 재할당했을 때 외부 변수도 함께 바뀌어야 한다. 하지만 JS는 그렇게 동작하지 않는다. 이 차이에 대해서는 아래 2-3)에서 다룬다.
e.g. 변수 복사
const employee1 = { name: 'john', age: 30 };
const employee2 = employee1; // 참조값(주소)이 복사됨
employee2.name = 'tony';
console.log(employee1.name); // 'tony' → 같은 주소를 가리키므로 원본도 변경됨
console.log(employee2.name); // 'tony'
e.g. 함수 인자 전달
function exchange(a, b) {
let temp = a.value;
a.value = b.value;
b.value = temp;
}
const x = { value: 1 };
const y = { value: 2 };
exchange(x, y);
console.log(`x: ${x.value}, y: ${y.value}`); // x: 2, y: 1
// 참조값이 전달되었기 때문에 프로퍼티 수정이 원본에 반영된다.