const
선언은 값에 읽기 전용 참조를 생성합니다. 담긴 값이 불변임을 뜻하는 게 아닙니다, 단지 그 변수 식별자는 재할당될 수 없습니다.
구문
const name1 = value1 [, name2 = value2 [, ... [, nameN = valueN]]];
설명
이 선언은 선언된 함수에 전역 또는 지역일 수 있는 상수를 만듭니다. 상수 초기자(initializer)가 필요합니다. 즉 선언되는 같은 문에 그 값을 지정해야 합니다(이는 나중에 변경될 수 없는 점을 감안하면 말이 됩니다).
상수는 let
문을 사용하여 정의된 변수와 마찬가지로 블록 범위(block-scope)입니다. 상수의 값은 재할당을 통해 바뀔 수 없고 재선언될 수 없습니다.
let
에 적용한 "일시적 사각 지대"에 관한 모든 고려는, const
에도 적용합니다.
상수는 같은 범위의 상수 또는 변수와 그 이름을 공유할 수 없습니다.
예
다음 예는 상수가 어떻게 동작하는지를 보입니다. 이를 브라우저 콘솔에 따라해 보세요.
// 주의: 상수는 대소문자로 선언될 수 있습니다, 하지만 // 일반 관례는 모두 대문자로 쓰는 것입니다. // MY_FAV를 상수로 정의하고 그 값을 7로 줌 const MY_FAV = 7; // 이는 Firefox 및 Chrome 에서 조용히 실패함 (하지만 Safari에서는 실패하지 않음) MY_FAV = 20; // 7이 찍힘 console.log("my favorite number is: " + MY_FAV); // 상수를 재선언하려는 시도는 오류 발생 const MY_FAV = 20; // 이름 MY_FAV는 위에서 상수에 예약되어, 이도 역시 실패함 var MY_FAV = 20; // MY_FAV는 여전히 7 console.log("my favorite number is " + MY_FAV); // const 변수 A에 할당은 구문 오류 const A = 1; A = 2; // const는 초기자가 필요 const FOO; // SyntaxError: const 선언 내에 = 가 빠짐 // const는 객체에도 동작 const MY_OBJECT = {"key": "value"}; // 객체 덮어쓰기는 위에서처럼 실패 (Firefox 및 Chrome 에서는 하지만 Safari 에서는 성공) MY_OBJECT = {"OTHER_KEY": "value"}; // 그러나, 객체 key는 보호되지 않기에 // 다음 문은 문제없이 실행됨 MY_OBJECT.key = "otherValue"; // 객체를 불변하게 하려면 Object.freeze()를 쓰세요
스펙
브라우저 호환성
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 (ES6) 스펙에 등장하기 오래 전에 Firefox에서 구현되었습니다. const
의 ES6 준수는 bug 950547 및 bug 611388 참조.
- SpiderMonkey 46 (Firefox 46 / Thunderbird 46 / SeaMonkey 2.43) 전에는,
TypeError
가SyntaxError
대신에 재선언 시 발생됐습니다(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에 무효한 할당")가 발생합니다.