자바스크립트에서 원시 값(원시 자료형)이란 객체가 아니면서 메서드도 가지지 않는 데이터이다.
원시 값의 종류 7가지
대부분의 경우 원시 값은 언어 구현체의 가장 저급 단계에서 나타난다.
모든 원시 값은 변형할 수 없다.
여기서 원시 값 자체와, 원시 값을 할당한 변수를 혼동하지 않는 것이 중요하다.
변수는 새로운 값을 다시 할당할 수 있지만, 이미 생성한 원시 값은 객체, 배열, 함수와는 달리 변형할 수 없다.
아래 예제들로 원시 값의 불변함을 확인할 수 있다.
// 문자열 메서드는 문자열을 변형하지 않음
var bar = "baz";
console.log(bar); // baz
bar.toUpperCase();
console.log(bar); // baz
// 배열 메소드는 배열을 변형함
var foo = [];
console.log(foo); // []
foo.push("plugh");
console.log(foo); // ["plugh"]
// 할당은 원시 값에 새로운 값을 부여 (변형이 아님)
bar = bar.toUpperCase(); // BAZ
원시 값을 교체할 수는 있지만 직접 변형할 수는 없다는 것을 확인할 수 있다.
// 원시 값
let foo = 5;
// 원시 값을 변경해야 하는 함수 정의
function addTwo(num) {
num += 2;
}
// 같은 작업을 시도하는 다른 함수
function addTwo_v2(foo) {
foo += 2;
}
// 원시 값을 인수로 전달해 첫 번째 함수를 호출
addTwo(foo);
// 현재 원시 값 반환
console.log(foo); // 5
// 두 번째 함수로 다시 시도
addTwo_v2(foo);
console.log(foo); // 5
위 코드의 진행과정을 살펴보자.
즉, 위의 진행과정은 결과적으로 원시 값에 직접 작업하지 않고, 복사본을 가져와 작업을 하기 때문에 원시 값은 변하지 않는다.
null과 undefined를 제외하고, 모든 원시 값은 원시 값을 래핑한 객체를 갖는다.
래퍼 객체의 valueOf() 메서드는 원시 값을 반환한다.
원시 자료형은 하나의 데이터만 담을 수 있지만,
참조 자료형은 여러 데이터를 담을 수 있다.
자바스크립트에서 진행되는 연산은 원본의 데이터를 수정 하는 것이 아닌, 원본의 데이터를 참조하여 별도의 공간에서 진행하는 것이라는 것을 깨달았다.