💡 아래 내용은 모던 자바스크립트 딥다이브를 공부하며 이해했던 내용을 다루고 있습니다. 혹시 틀렸거나 잘못된 정보가 있다면 알려주세요!
원시 타입의 값은 변경 불가능한 값입니다. 한번 생성된 원시값은 읽기 전용값으로서 변경할 수 없습니다. 변수 값을 변경하기 위해 원시 값을 재할당하면 새로운 메모리 공간을 확보하고 재할당한 값을 저장한 후, 변수가 참조하던 메모리 공간의 주소를 변경한다. 원시 값의 이러한 특성을 불변성이라고 합니다.
JS에서 문자열이 불변하다는 것은, 한번 생성된 문자열은 변경할 수 없다는 것을 의미합니다. 즉, 문자열의 일부 문자를 변경하려고 하는게 불가능하다는 것을 뜻합니다. 한편, 불변성 때문에 문자열에 여러 번의 연산을 수행하면 많은 임시 문자열이 생성되고, 이는 메모리 사용량이 증가하고 성능에 영향을 줄 수 있습니다. 따라서 이런 점을 고려하여 코드를 작성해야 합니다.
let string = "hello";
string[0] = "H";
console.log(string); // 출력: "hello"
함수에 값을 전달할 때, 실제 값이 복사되어 전달되는 방식을 말합니다. 이는 원본 값이 아닌 복사된 값을 함수가 받기 때문에, 함수 내에서 이 값을 변경해도 원본 값에는 아무런 영향을 미치지 않습니다. 이러한 특성은 원시 값을 안전하게 전달하고, 함수가 원본 값을 변경하지 못하게 하여 데이터의 안정성을 보장하는 데 도움이 됩니다.
let x = 10;
function changeValue(a) {
a = 20;
}
changeValue(x);
console.log(x); // 출력: 10
객체는 변경 가능한 값입니다. 즉, 객체를 참조하는 변수는 해당 객체의 프로퍼티를 변경할 수 있습니다. 이는 객체가 '참조에 의한 전달' 방식으로 작동하기 때문입니다.
객체를 전달할 때, 객체 자체가 아닌 객체의 참조(메모리에서 객체의 위치)가 전달되는 것을 말합니다. 이로 인해, 함수 내에서 전달받은 객체의 속성을 변경하면, 원본 객체에도 그 변경 사항이 반영됩니다. 이는 함수가 실제 객체를 참조하고 있기 때문입니다.
let obj = { name: "John" };
function changeName(o) {
o.name = "Jane";
}
changeName(obj);
console.log(obj.name); // 출력: "Jane"