primitive(원시 값, 원시 자료형)는 객체 도 아니고 메서드도 아닌 데이터 입니다. JavaScript에는 다음과 같은 6개의 원시 데이터 타입이 있습니다: string, number, boolean, null, undefined, symbol (ECMAScript 2015 에 신규로 추가됨).

주로, 원시 값은 언어 실행의 가장 낮은 레벨을 의미합니다. 

모든 원시 값은 변경할 수 없습니다. 다시 말해, 대체될 수 없습니다. 원시 값이 할당된 변수와 원시 값 그 자체를 혼동하지 않는 것이 중요합니다. 변수는 새로운 값으로 재 할당 될 수 있지만, 객체, 배열, 함수가 대체될 수 없는 것 처럼, 존재하는 값은 변경될 수 없습니다.

예제

이 예제는 원시 값이 변경될 수 없음을 이해하는데 도움이 됩니다.

JavaScript

// string 메소드를 사용하는 것은 문자열을 변형하지 않음
var bar = "baz";
console.log(bar);               // baz
bar.toUpperCase();
console.log(bar);               // baz

// array 메소드를 사용하는 것은 배열을 변형 시킴
var foo = [];
console.log(foo);               // []
foo.push("plugh");
console.log(foo);               // ["plugh"]

// 할당으로 원시 값에 새로운 값을 줌(변형 시키는 것이 아님)
bar = bar.toUpperCase();       // BAZ

원시 값은 교체될 수는 있지만, 직접적으로 대체될 수는 없습니다.

또 다른 예제 [ 스텝 바이 스텝 ]

다음 예제는 자바스크립트가 원시 값을 다루는 방법을 이해하는데 도움이 됩니다.

JavaScript

// 원시 값
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

5 대신 7 일 것이라고 예상하였나요? 그렇다면, 이 코드가 어떻게 실행되는지 다음을 읽어보세요.

  • addTwo 와 addTwo_v2 함수 호출을 위해, 자바스크립트는 식별자 foo 의 값을 찾습니다. 이는 인스턴스화된 첫 번째 구문의 변수를 올바르게 찾습니다.
  • 찾은 다음, 자바스크립트는 인수를 함수의 파라미터로 전달합니다.
  • 함수의 바디 내 구문들을 실행하기 전에, 자바스크립트는 원래 전달된 인수(원시 값)를 복사해 로컬 복사본을 생성합니다. 이러한 복사본은 함수의 스코프 내에서만 존재하며, 함수 정의 내에 지정한 식별자를 통해 접근가능합니다(addTwo 의 numaddTwo_v2 의 foo).
  • 그 후, 함수의 구문들이 실행됩니다.
    • 첫 번째 함수내에서, 로컬 num 인수가 생성되었습니다. 이 값을 2 증가시키는 것이며, 원래 foo 의 값이 아닙니다!
    • 두 번째 함수내에서, 로컬 foo 인수가 생성되었습니다. 이 값을 2 증가시키는 것이며, 원래(외부) foo 의 값이 아닙니다! 또한, 이 경우에서, 외부 foo 변수에는 어떤 방법으로든 접근할 수 없습니다. 이는 자바스크립트의 어휘적 유효 범위(lexical scoping)와 결과 변수 섀도잉 때문입니다. 로컬 foo 는 외부 foo 를 숨깁니다. 자세한 내용은, 클로져 문서를 보세요.
  • 결과적으로, 우리 함수들 내부의 모든 변경은 그 복사본으로 작업하였기 때문에, 원본 foo 에 전혀 영향을 주지 않았습니다.

이것이 원시 값이 변하지 않는 이유입니다. 원시 값에 직접 작업하지 않으므로, 원본을 건드리지 않고 복사본 가져와 계속 작업을 합니다.

JavaScript에서의 원시 래퍼 객체

null 과 undefined 를 제외하고, 모든 원시 값은 원시 값을 래핑한 객체를 갖습니다.

  • string 원시 값을 위한 String 객체.
  • number 원시 값을 위한 Number 객체.
  • Boolean 원시 값을 위한 Boolean 객체.
  • Symbol 원시 값을 위한 Symbol 객체.

래퍼 객체의 valueOf() 메소드는 원시 값을 리턴합니다.

더 알아보기

일반 상식

문서 태그 및 공헌자

이 페이지의 공헌자: cs09g, urty5656, nicesh
최종 변경자: cs09g,