prosource

자바스크립트에서 상수 객체를 변경할 수 있는 이유는 무엇입니까?

probook 2023. 9. 5. 20:38
반응형

자바스크립트에서 상수 객체를 변경할 수 있는 이유는 무엇입니까?

ES6가 아직 표준화되지 않았다는 것은 알지만, 현재 많은 브라우저가 지원합니다. const키워드를 입력합니다.

사양에서 다음과 같이 기록됩니다.

상수 값은 재할당을 통해 변경될 수 없으며 상수를 다시 선언할 수 없습니다.이 때문에 초기화하지 않고 상수를 선언할 수는 있지만, 그렇게 해도 소용이 없을 것입니다.

제가 이런 일을 할 때:

const xxx = 6;
xxx = 999;
xxx++;
const yyy = [];
yyy = 'string';
yyy = [15, 'a'];

괜찮은 것 모든것괜것같은습다니찮이다같▁i니습것은thing.xxx 직도입니다.6그리고.yyy이라[].

하지만 내가 한다면,yyy.push(6); yyy.push(1); 내 상수 배열이 변경되었습니다.은 지금당은입니다.[6, 1]그리고 그건 그렇고, 나는 여전히 그것을 바꿀 수 없습니다.yyy = 1;.

이게 벌레야, 아니면 내가 뭔가를 놓쳤니?저는 최신 크롬과 FF29로 시도했습니다.

설명서에는 다음이 명시되어 있습니다.

할 수 ...재할당을 통해 변경할 수 없습니다.
할 수 ...파일을 다시 검색할 수 없습니다.

배열이나 개체를 추가할 때 상수를 다시 할당하거나 다시 선언하지 않고 이미 선언하고 할당한 경우에는 상수가 가리키는 "목록"에 추가하는 것입니다.

그래서 이것은 잘 작동합니다.

const x = {};

x.foo = 'bar';

console.log(x); // {foo : 'bar'}

x.foo = 'bar2';

console.log(x); // {foo : 'bar2'}  

그리고 이것은:

const y = [];

y.push('foo');

console.log(y); // ['foo']

y.unshift("foo2");

console.log(y); // ['foo2', 'foo']

y.pop();

console.log(y); // ['foo2']

하지만 이 중 어느 것도.

const x = {};
x = {foo: 'bar'}; // error - re-assigning

const y = ['foo'];
const y = ['bar']; // error - re-declaring

const foo = 'bar'; 
foo = 'bar2';       // error - can not re-assign
var foo = 'bar3';   // error - already declared
function foo() {};  // error - already declared

이는 상수가 실제로 배열에 대한 참조를 저장하고 있기 때문에 발생합니다.어떤 것을 배열에 결합할 때 상수 값을 수정하는 것이 아니라 해당 값이 가리키는 배열을 수정하는 것입니다.개체를 상수에 할당하고 해당 개체의 속성을 수정하려고 해도 동일한 현상이 발생합니다.

어레이 또는 개체를 고정하여 수정할 수 없도록 하려면 이미 ECMA스크립트 5에 포함되어 있는 메서드를 사용할 수 있습니다.

const x = Object.freeze(['a'])
x.push('b')
console.log(x) // ["a"]

다음과 같이 정의한 후에도 개체를 업데이트할 수 있었던 이유를 검색하던 중 이 기사를 보게 되었습니다.const여기서 중요한 점은 개체가 직접적으로 업데이트할 수 있는 것이 아니라 개체에 포함된 속성이라는 것입니다.

예를 들어, 내 개체는 다음과 같습니다.

const number = {
    id:5,
    name:'Bob'
};

위의 답변은 상수인 객체이며 속성이 아니라는 것을 올바르게 지적했습니다.따라서 다음을 수행하여 ID 또는 이름을 업데이트할 수 있습니다.

number.name = 'John';

그러나 다음과 같이 개체 자체를 업데이트할 수 없습니다.

number = {
    id:5,
    name:'John'
  };

TypeError: Assignment to constant variable.

이것은 제가 생각할 수 있는 모든 프로그래밍 언어와 일관된 행동입니다.

C - 배열이 단지 미화된 포인터라고 생각합니다.일정한 배열은 포인터의 값이 변경되지 않음을 의미할 뿐이지만 실제로는 해당 주소에 포함된 데이터는 다음과 같습니다.

Javascript에서는 상수 객체의 메서드를 호출할 수 있습니다(물론 그렇지 않으면 상수 객체는 많은 목적을 달성하지 못할 것입니다!).)이러한 방법은 개체를 수정하는 부작용이 있을 수 있습니다.Javascript의 배열은 개체이므로 이러한 동작이 해당 배열에도 적용됩니다.

당신이 확신하는 것은 상수가 항상 같은 물체를 가리킬 것이라는 것입니다.개체 자체의 속성은 자유롭게 변경할 수 있습니다.

const라는 키워드는 약간 오해의 소지가 있습니다.

상수 값을 정의하지 않습니다.값에 대한 일정한 참조를 정의합니다.

따라서 다음을 수행할 수 없습니다.

  • 상수 값 재할당
  • 상수 배열 재할당
  • 상수 개체 재할당

하지만 할 수 있는 것은:

  • 상수 배열 변경
  • 상수 개체 변경

저는 이것이 https://codeburst.io/explaining-value-vs-reference-in-javascript-647a975e12a0 라는 이슈에 대해 더 명확하게 해줄 것이라고 생각합니다.

기본적으로 다음과 같이 요약됩니다.const항상 메모리의 동일한 주소를 가리킵니다.할 수 할 수 .const가리키기도 합니다.

const당신이 언급한 것은 다음과 같을 것입니다.const원시 값을 포함하는 주소를 가리킵니다.이 이 값할할수때없에 할 수 입니다.const주소를 변경하지 않고(이것이 원시 값을 할당하는 방식이기 때문에), 주소를 변경합니다.const허용되지 않습니다.

▁▁if▁where▁as.const이 값을 가리킵니다. 주소의 값을 편집할 수 있습니다.

구성 선언은 값에 대한 읽기 전용 참조를 만듭니다.이는 변수 식별자를 다시 할당할 수 없다는 것을 의미하는 것이 아니라, 이 값이 불변이라는 것은 변수 식별자를 다시 할당할 수 없다는 것입니다.예를 들어, 내용이 개체인 경우, 이는 개체의 내용(예: 매개 변수)을 변경할 수 있음을 의미합니다.

또한 중요한 참고 사항:

글로벌 상수가 창 개체의 속성이 되지 않습니다...

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const

상수의 값은 재할당을 통해 변경될 수 없으며 다시 선언할 수도 없습니다.

const testData = { name:"Sandeep",lastName:"Mukherjee",company:"XYZ"}

첫 번째 경우

testData = {name:"hello"}
console.log(testData);//throws an Error:Assignment to constant variable
Here we are reassigning testData again

두 번째 경우

const testData = {name:"Sandeep",lastName:"Mukherjee",company:"ABC"}
console.log(testData); //throws an Error: Identifier 'testData' has already been declared
Here we are redeclaring testData again

const를 사용하여 변수가 선언되면 const의 동작이 메모리 위치를 가리킴을 의미합니다. const의 동작은 해당 메모리 위치에 저장된 값을 조작할 수 있지만 메모리 위치는 조작할 수 없습니다. const 변수를 재할당/재선언하면 메모리 위치를 변경할 수 없습니다.

특정 키의 값을 변경할 수 있습니다.

testData.company = "Google"
 console.log(testData);
 //{ name: 'Sandeep', lastName: 'Mukherjee', company: 'Google' }

새 키 값 쌍을 추가할 수 있습니다.

 testData.homeTown = "NewYork"
 console.log(testData)
 //{name: 'Sandeep',lastName:'Mukherjee',company:'Google',homeTown: 'NewYork'}

왜냐하면 const에서는 객체의 값을 변경할 수 있기 때문에 객체는 실제로 할당 데이터를 저장하지 않고 객체를 가리키기 때문입니다. 따라서 Javascript에서는 원시 데이터와 객체 간에 차이가 있습니다.

constvariable은 주소(0xFF2와 같은 메모리 주소)를 저장합니다.DFC)는 일정합니다.

상수는 메모리의 내용이 아닙니다.

상수는 메모리 주소 전용입니다.

읽어주셔서 감사합니다.

const MY_OBJECT = {'key': 'value'};

개체를 덮어쓰려고 하면 // Uncaught TypeError:상수 변수에 할당합니다.MY_OBJECT = {'OTHER_KEY': 'value'};

그러나 개체 키는 보호되지 않으므로 // 다음 문이 문제 없이 실행됩니다.MY_OBJECT.key = 'otherValue';개체 사용.물체를 불변으로 만들기 위해 freeze ()

어레이에도 동일하게 적용됨const MY_ARRAY = [];항목을 배열로 밀어넣을 수 있습니다.MY_ARRAY.push('A');["A"] // 변수에 새 배열을 할당하면 // Uncaught TypeError:상수 변수에 할당합니다.MY_ARRAY = ['B'];

상수는 객체가 아니라 객체에 대한 링크로 저장됩니다.

이 링크는 일정하기 때문에 변경할 수 없습니다.하지만 당신은 바꿀 수 있습니다.

첫째, const 선언된 변수는 다시 선언하거나 재할당할 수 없습니다.

const foo = 5;//기본 데이터 유형으로 초기화 중, 에 할당됨

const bar = [1,2,3];//개체(array,object,function,...)에 초기화, 객체의 참조에 할당됨

const를 사용하여 변수를 재할당하려고 하면 Uncaught Type Error:상수 변수에 할당합니다.

둘 다 할 수 없어요!

const five=5; // initialized to a value
five=6;       // trying to reassign

const obj={};
obj = {foo:"foo",bar:"bar"}; //trying to reassign 

하지만 이렇게 객체를 수정할 수 있습니다.

const obj ={};
obj.foo="foo";
obj.bar="bar";
console.log(obj); //{foo:"bar,bar:"bar"}

const arr=[];
arr[0] = 1;
arr[1] = 2;
arr[3] = 4;
console.log(arr); //[1,2,undefined,4]

참고: 참조를 변경하는 것이 아니라 참조가 가리키는 데이터만 변경합니다.

의문점이 있으시면 언제든지 말씀해 주십시오...

언급URL : https://stackoverflow.com/questions/23436437/why-can-i-change-a-constant-object-in-javascript

반응형