키워드 'const'는 값을 변경 불가능하게 만들지 않습니다. 무슨 뜻이에요?


85

있다 CONST 정의ES6 탐색 박사 악셀 Rauschmayer으로는 :

constlet처럼 작동하지만 선언 한 변수는 나중에 변경할 수없는 값 으로 즉시 초기화되어야합니다 . […]

const bar = 123;
bar = 456;  // TypeError: `bar` is read-only

그리고 그는 쓴다

함정 : const는 값을 불변으로 만들지 않습니다.

const 변수가 항상 같은 값을 가짐을 의미 할뿐 값 자체가 변하지 않거나 불변이된다는 의미는 아닙니다.

나는이 함정에 약간 혼란스러워한다. 누구 const든지이 함정을 명확하게 정의 할 수 있습니까 ?


38
MDN의 설명이 명확하다 는 "CONST 선언 값을 읽기 전용 기준을 만들고 그것을 보유 값이 변수 식별자를 재 할당 할 수없는 단지 불변 의미하지 않는 예를 들어, 경우에 콘텐츠가있다.. 목적 , 이것은 객체 자체 가 여전히 변경 될 수 있음을 의미합니다 . " (강조 내)
Gerardo Furtado

4
즉, 값이 변경 가능하면 (예 : 객체 인 경우) 해당 객체를 변경할 수 있습니다 (예 : 속성 업데이트, 추가, 제거).
Felix Kling

2
const x = "immutable"불변이기 때문에 String불변입니다. const단순히 재 할당을 금지합니다.

3
@ibrahimmahrir : 통과 참조하면 (자바 스크립트 객체에 대해 무엇을) 통과와 동일하지 의해 (이 값은 무관하다 바인딩 사이의 관계를 설명한다) 참조.
펠릭스 클링

2
@ibrahimmahrir : 네, 그게 문제입니다. 참조에 의한 전달 이라는 용어 는 매우 구체적인 의미를 갖습니다 .
펠릭스 클링

답변:


97

MDN은 그것을 멋지게 요약합니다.

const 선언은 값에 대한 읽기 전용 참조를 만듭니다. 보유한 값이 변경 불가능하다는 의미가 아니라 변수 식별자를 재 할당 할 수 없다는 의미입니다. 예를 들어 콘텐츠가 객체 인 경우 이는 객체 자체가 여전히 변경 될 수 있음을 의미합니다.

더 간결하게 : const는 불변의 바인딩을 만듭니다.

즉, var와 마찬가지로 const는 무언가를 저장하는 가변 메모리 청크를 제공합니다. 그러나 const는 동일한 메모리 청크를 계속 참조해야한다고 지시합니다. 변수 참조가 일정하기 때문에 변수를 다른 메모리 청크에 다시 할당 할 수 없습니다.

선언 한 후에 무언가를 일정하고 변하지 않게 만들려면 Object.freeze(). 그러나 이는 얕고 키 / 값 쌍에서만 작동합니다. 전체 개체를 고정하려면 약간 더 많은 노력이 필요합니다. 이를 수행하는 방식으로 반복하는 것은 훨씬 더 어렵습니다. 정말로 필요하다면 Immutable.js 와 같은 것을 확인하는 것이 좋습니다.


20
C 용어 : 법선 var x이 a struct Object *x이면 a const x는 a struct Object *const x입니다. 포인터는 변경할 수 없습니다. 그것이 가리키는 것은 할 수 있습니다.
기금 모니카의 소송

151

constJavaScript로 무언가를 만들 때 다른 것을 참조하도록 변수 자체를 재 할당 할 수 없습니다. 그러나 변수는 여전히 변경 가능한 객체를 참조 할 수 있습니다.

const x = {a: 123};

// This is not allowed.  This would reassign `x` itself to refer to a
// different object.
x = {b: 456};

// This, however, is allowed.  This would mutate the object `x` refers to,
// but `x` itself hasn't been reassigned to refer to something else.
x.a = 456;

문자열 및 숫자와 같은 기본 요소의 경우 const값을 변경하지 않고 대신 새 값을 변수에 할당하기 때문에 이해하기가 더 쉽습니다.


18
이 대답은 받아 들여진 대답보다 훨씬 낫습니다. 더 간결하고 실제 예제 코드가 포함되어 있습니다. (즉, 포인트에 도달합니다 .) +1
jpmc26

16

리 바인딩

constlet선언 식별자와 값 사이 (일명 재 할당) rebindings 허용할지 여부를 제어 :

const x = "initial value";
let y = "initial value";

// rebinding/reassignment

try { x = "reassignment" } catch(e) { console.log(x) } // fails

y = "reassignment"; // succeeds
console.log(y);

불변성

불변성은 유형 수준에서 제어됩니다. Object는 변경 가능한 유형이지만 String은 변경 불가능한 유형입니다.

const o = {mutable: true};
const x = "immutable";

// mutations

o.foo = true; // succeeds
x[0] = "I"; // fails

console.log(o); // {mutable: true, foo: true}
console.log(x); // immutable


1

const는 처음 할당 된 값을 변경할 수 없음을 의미합니다.

먼저 js 의 이 무엇인지 정의하십시오 . 값은 부울, 문자열, 숫자, 개체, 함수 및 정의되지 않은 값이 될 수 있습니다.

좋아요 : 사람들이 당신의 이름으로 당신을 부르고 있습니다. 그것은 변하지 않습니다. 하지만 옷을 갈아 입습니다. 사람들과 당신 사이 의 결속 은 당신의 이름입니다. 나머지는 바뀔 수 있습니다. 이상한 예를 들어 죄송합니다.

그래서 몇 가지 예를 들어 보겠습니다.

// boolean
const isItOn = true;
isItOn = false;           // error

// number
const counter = 0;
counter++;                // error

// string
const name = 'edison';
name = 'tesla';           // error

// objects
const fullname = {
  name: 'albert',
  lastname: 'einstein'
};

fullname = {              // error
  name: 'werner',
  lastname: 'heisenberg'
};
// NOW LOOK AT THIS:
//
// works because, you didn't change the "value" of fullname
// you changed the value inside of it!
fullname.name = 'hermann';

const increase = aNumber => ++aNumber;
increase = aNumber => aNumber + 1;      // error

// NOW LOOK AT THIS:
//
// no error because now you're not changing the value
// which is the decrease function itself. function is a
// value too.
let anotherNumber = 3;
const decrease = () => --anotherNumber;

anotherNumber = 10;             // no error
decrease();                     // outputs 9

const chaos = undefined;
chaos = 'let there be light'    // error

const weird = NaN;
weird = 0                       // error

보시다시피 "첫 번째" 할당 된 값을 const로 변경하지 않는 한 오류가 없습니다. 처음 할당 된 값을 다른 값으로 변경하려고 할 때마다 화가 나서 오류가 발생합니다.

따라서 이것은 const. 즉, 선언의 값으로 초기화되어야합니다. 그렇지 않으면 화가납니다.

const orphan;                    // error
const rich = 0;                  // no error

0

ES6/ ES2015 const키워드 :

const키워드 (선언과 같은 블록 범위 변수를 선언하기 위해 사용된다 let). 의 변수를 선언의 차이 const와는 let다음과 같다 :

  1. 선언 된 변수는 다시 할당const 할 수 없습니다 .
  2. 로 선언 된 변수는 const해야 할당 할 때 선언했다 . 로 선언 된 변수는 const재 할당 할 수 없기 때문에 이전 요점의 논리적 결과입니다. 그래서 변수를 선언 할 때 정확히 한 번 할당해야합니다 .

예:

// we declare variable myVariable
let myVariable;

// first assignment
myVariable = 'First assingment';
// additional assignment
myVariable = 'Second assignment';

// we have to declare AND initialize the variable at the same time
const myConstant = 3.14;

// This will throw an error
myConstant = 12;

위의 예에서 다음을 관찰 할 수 있습니다.

  1. myVariable선언 된 변수 let를 먼저 선언 한 다음 할당 할 수 있습니다.
  2. myConstant선언 된 변수 는 const동시에 선언되고 할당되어야합니다.
  3. 변수를 다시 할당하려고 myConstant하면 다음 오류가 발생합니다.

포착되지 않은 TypeError : 상수 변수에 할당

주의 사항 :로 할당 된 변수 const는 여전히 변경 가능합니다.

로 선언 된 변수는 const재 할당 할 수 없으며 여전히 변경 가능 합니다. 변경 가능하다는 것은 const변수 에 할당 된 데이터 구조 (객체, 배열, 맵 등)가 여전히 변경 (즉, 변경) 될 수 있음을 의미합니다. 돌연변이의 예는 다음과 같습니다.

  1. 개체 속성 추가 / 삭제 / 변경
  2. 특정 배열 인덱스에서 배열 값 변경

정말로 객체가 변경되지 않기를 원한다면 Object.freeze(). 이것은 물체를 동결시키는 방법입니다. 고정 된 개체는 더 이상 변경할 수 없으며 새 속성을 추가 할 수 없습니다.

예:

const obj = {prop1: 1};

obj.prop1 = 2;
obj.prop2 = 2;

console.log(obj);

// We freeze the object here
Object.freeze(obj);

obj.prop1 = 5;
delete obj.prop2;

// The object was frozen and thus not mutated
console.log(obj);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.