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

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

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

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

그리고 그는 쓴다

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

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

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



답변

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

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

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

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

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


답변

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값을 변경하지 않고 대신 새 값을 변수에 할당하기 때문에 이해하기가 더 쉽습니다.


답변

리 바인딩

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


답변

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


답변

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);


답변