MDN’s new design is in Beta! A sneak peek: https://blog.mozilla.org/opendesign/mdns-new-design-beta/

const 선언은 값에 읽기 전용 참조를 생성합니다. 담긴 값이 불변임을 뜻하는 게 아닙니다, 단지 그 변수 식별자는 재할당될 수 없습니다.

구문

const name1 = value1 [, name2 = value2 [, ... [, nameN = valueN]]];
nameN
상수명, 이는 어떤 적법한 식별자든 될 수 있습니다.
valueN
상수값. 즉 이는 어떤 적법한 이든 될 수 있습니다.

설명

이 선언은 선언된 함수에 전역 또는 지역일 수 있는 상수를 만듭니다. 상수 초기자(initializer)가 필요합니다. 즉 선언되는 같은 문에 그 값을 지정해야 합니다(이는 나중에 변경될 수 없는 점을 감안하면 말이 됩니다).

상수는 let 문을 사용하여 정의된 변수와 마찬가지로 블록 범위(block-scope)입니다. 상수의 값은 재할당을 통해 바뀔 수 없고 재선언될 수 없습니다.

let에 적용한 "일시적 사각 지대"에 관한 모든 고려는, const에도 적용합니다.

상수는 같은 범위의 상수 또는 변수와 그 이름을 공유할 수 없습니다.

다음 예는 상수가 어떻게 동작하는지를 보입니다. 이를 브라우저 콘솔에 따라해 보세요.

// 주의: 상수는 대소문자로 선언될 수 있습니다, 하지만
// 일반 관례는 모두 대문자로 쓰는 것입니다.

// MY_FAV를 상수로 정의하고 그 값을 7로 함
const MY_FAV = 7;

// 에러가 발생함
MY_FAV = 20;

// 7이 찍힘
console.log("my favorite number is: " + MY_FAV);

// 상수를 재선언하려는 시도는 오류 발생
const MY_FAV = 20;

// MY_FAV라는 이름은 위에서 상수로 예약되어 있어서 역시 실패함.
var MY_FAV = 20;

// 역시 오류가 발생함
let MY_FAV = 20;

// 블록 범위 지정의 성격에 주목하는 것이 중요합니다.
if (MY_FAV === 7) { 
    // 블록 범위로 지정된 MY_FAV 라는 변수를 만드므로 괜찮습니다
    // (let으로 const 변수가 아닌 블록 범위를 선언하는 것과 똑같이 동작합니다)
    let MY_FAV = 20;

    // MY_FAV는 이제 20입니다
    console.log('my favorite number is ' + MY_FAV);

    // 이 선언은 전역으로 호이스트되고 에러가 발생합니다.
    var MY_FAV = 20;
}

// MY_FAV는 여전히 7입니다.
console.log('my favorite number is ' + MY_FAV);

// const 선언시에 초기값을 생랴해서 에러가 발생합니다
const FOO; 

// const는 오브젝트에도 잘 동작합니다
const MY_OBJECT = {'key': 'value'};

// 오브젝트를 덮어쓰면 오류가 발생합니다
MY_OBJECT = {'OTHER_KEY': 'value'};

// 하지만 오브젝트의 키는 보호되지 않습니다.
// 그러므로 아래 문장은 문제없이 실행됩니다
MY_OBJECT.key = 'otherValue'; // 오브젝트를 변경할 수 없게 하려면 Object.freeze() 를 사용해야 합니다

// 배열에도 똑같이 적용됩니다
const MY_ARRAY = [];
// 배열에 아이템을 삽입하는 건 가능합니다
MY_ARRAY.push('A'); // ["A"]
// 하지만 변수에 새로운 배열을 배정하면 에러가 발생합니다
MY_ARRAY = ['B']

스펙

스펙 상태 설명
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Let and Const Declarations' in that specification.
Standard 초기 정의.
ECMAScript Latest Draft (ECMA-262)
The definition of 'Let and Const Declarations' in that specification.
Draft  

브라우저 호환성

Feature Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari
Basic support 21 (Yes) 36 (36) 11 12 5.1
Reassignment fails 20 (Yes) 13 (13) 11 ? ?
Allowed in sloppy mode 49.0          
Feature Android Android Webview Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile Chrome for Android
Basic support No support (Yes) ? ? (Yes) ? (Yes)
Reassignment fails No support (Yes) ? ? (Yes) ? (Yes)
Allowed in sloppy mode No support 49.0         49.0

호환성 주의사항

Firefox & Chrome의 이전 버전 및 현재 Safari 5.1.7 및 Opera 12.00 에서는, const로 변수를 정의하는 경우, 여전히 나중에 그 값을 바꿀 수 있습니다. Internet Explorer 6-10에서는 지원되지 않지만 Internet Explorer 11에 포함되었습니다.

Firefox 전용 주의사항

const 선언은 const가 ECMAScript 2015 스펙에 등장하기 오래 전에 Firefox에서 구현되었습니다. const의 ES2015 준수는 bug 950547bug 611388 참조.

  • SpiderMonkey 46 (Firefox 46 / Thunderbird 46 / SeaMonkey 2.43) 전에는, TypeErrorSyntaxError 대신에 재선언 시 발생됐습니다(bug 1198833).
  • SpiderMonkey 36 (Firefox 36 / Thunderbird 36 / SeaMonkey 2.33) 부터:
    • {const a=1};a는 이제 ReferenceError가 발생하고 블록 범위로 인해 더는 1을 반환하지 않습니다.
    • const a;는 이제 SyntaxError ("const 선언 내에 = 가 빠짐")가 발생합니다: 초기자가 필요합니다.
    • const a = 1; a = 2;도 이제 SyntaxError ("const a에 무효한 할당")가 발생합니다.

참조

문서 태그 및 공헌자

 이 페이지의 공헌자: maxtortime, kdex, Netaras, kuil09
 최종 변경: maxtortime,