원시 타입은 immutable한 특성을 가진다. 즉 변경 불가능한 값이다.
참조 타입은 mutable한 특성을 가진다. 즉 변경 가능한 프로퍼티를 가진다.
파라미터(함수의 매개변수)에 원시 타입을 할당한다면 데이터의 원본값을 복사하여 전달한다. 이는 'call by value', '값에 의한 호출'이라고 불린다.
한편, 참조 타입을 할당한다면 데이터의 참조값을 복사하여 전달한다. 엄밀히 말하자면 이는 데이터의 참조값을 그대로 전달하는 'call by reference', '참조에 의한 호출'이 아니다. 정식 용어는 아니지만, 구분을 위해 이 경우를 'call by sharing'이라고 한다.
즉, 자바스크립트는 call by value의 개념만 존재하므로, call by value로 동작한다고 할 수 있다.
만약 파라미터가 아닌 일반 변수에 할당한다면 call~ 대신 pass~ 를 사용하여 '값에 의한 전달', '참조에 의한 전달'이라는 용어를 사용한다. 자바스크립트에서는 역시 pass by value의 개념만 존재한다.
아래와 같은 객체가 있다. 이 때, 두 가지 동작에 대해 살펴보자.
const obj = {
name: 'origin name'
}
const changeName = (param) => {
param.name = 'changed name'
}
changeName(obj);
위와 같이 프로퍼티에 접근하여 값을 변경하는 경우, 기존 메모리 주소를 유지하며 값을 변경한다.
따라서 obj
객체의 값이 함수에 의해 변경된다.
const changeName = (param) => {
param = {name: 'changed name'}
}
changeName(obj);
위와 같이 새로운 참조 타입 데이터를 만들어 값을 변경하는 경우, 주소값이 재할당된다. 즉 기존 메모리 주소가 새로운 객체의 메모리 주소로 변경된다.
따라서 obj
객체의 값이 변경되지 않는다.