"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Javascript의 객체 가변성

Javascript의 객체 가변성

2024-08-19에 게시됨
검색:190

Object Mutability in Javascript

객체 가변성

변경 가능성은 값을 변경하는 능력입니다. 변경 가능한 값은 변경될 수 있고 변경 불가능한 값은 변경될 수 없습니다. 일반적인 오해는 "const" 키워드가 변수를 불변으로 만든다는 것입니다.

const

실제로 "const"는 재할당만 방지합니다. 객체가 아닌 유형의 경우 값은 재할당을 통해서만 변경할 수 있으므로 "const"로 선언하면 실제로는 변경할 수 없게 됩니다. 예를 들어 다음 코드를 고려해보세요.

const num = 5;
num = 7; // illegal reassignment of const variable

이 코드에서 num 값을 변경할 수 있는 방법은 없습니다. 또는 --를 사용하는 것은 여전히 ​​재할당으로 간주되며 const로 선언된 변수에 사용하려고 하면 오류 메시지에 표시됩니다.

상수 번호 = 5; num ;//상수 재할당이 잘못되었습니다.
const num = 5;
num  ;//illegal reassignment of constant
결과 오류는 다음과 같습니다.


잡히지 않은 TypeError: 상수 변수에 할당되었습니다.
const num = 5;
num  ;//illegal reassignment of constant
const 객체는 변경 가능

객체는 변수를 재할당하지 않고도 값이 변경될 수 있다는 점에서 가변성과 관련하여 근본적으로 다릅니다. 속성의 재할당은 "const"에 의해 방지되지 않습니다. 변수 이름만 재할당이 금지됩니다.


const obj = {숫자: 5}; obj.num = 7; //합법적인 obj = {숫자: 7}; //불법 재할당
const num = 5;
num  ;//illegal reassignment of constant
객체에는 내부 값을 변경하는 메서드도 있을 수 있습니다.


const obj = { 번호: 5, 증가(){ this.num ; } } obj.increment(); console.log(obj.num); //6
const num = 5;
num  ;//illegal reassignment of constant
객체를 불변으로 만들기

"const"로 선언하고 Object.freeze()를 사용하여 객체를 실제로 불변으로 만드는 것이 가능합니다.


const obj = {숫자: 5}; Object.freeze(obj); obj.num = 7; // 변하지 않음 console.log(obj.num);// 여전히 5
const num = 5;
num  ;//illegal reassignment of constant
엄격 모드를 사용하는 경우 num 값을 변경하려고 하면 실제로 다음 오류 메시지와 함께 충돌이 발생합니다.


읽기 전용 속성 'num'에 할당할 수 없습니다.
const num = 5;
num  ;//illegal reassignment of constant
"const" 없이 Object.freeze()를 사용하는 것만으로도 이 객체를 불변으로 만드는 데 충분합니다. 그러나 변수 이름을 변경할 수 없게 만들지는 않습니다.


let obj = {숫자: 5}; Object.freeze(obj); obj = {숫자: 5}; // 이전 이름을 가진 새 객체 obj.num = 7; // 성공적으로 변경되었습니다. console.log(obj.num);// 7
const num = 5;
num  ;//illegal reassignment of constant
이 버전의 코드에서는 obj가 재할당됩니다. 동일한 이름을 공유하는 이전 객체에 동결()이 적용되었지만 새 객체는 동결된 적이 없으므로 변경 가능합니다.

밀봉물체

객체의 값 변경을 허용하고 싶지만 속성 추가 또는 제거는 허용하고 싶지 않은 경우가 있습니다. 이는 Object.seal()을 사용하여 달성할 수 있습니다.


let obj = {숫자: 5}; Object.seal(obj); obj.num = 7; // 변경 console.log(obj.num);// 7 obj.newValue = 42; //봉인된 객체에 새 속성을 추가할 수 없습니다. console.log(obj.newValue);//정의되지 않음 obj.num 삭제; //봉인된 객체에서 속성을 삭제할 수 없습니다. console.log(obj.num);// 여전히 존재하며 7입니다.
const num = 5;
num  ;//illegal reassignment of constant
세분화된 제어

물체 전체에 동결 및 밀봉이 적용됩니다. 특정 속성을 불변으로 만들려면 정의() 또는 정의 프로퍼티()를 사용하면 됩니다. 이 둘 사이의 선택은 단일 속성에 영향을 미치려는지 아니면 여러 속성에 영향을 미치려는지에 따라 달라집니다.


const obj = {}; Object.defineProperty(obj, 'num',{ 값: 5, 쓰기 가능: 거짓, 구성 가능: 거짓 }); obj.num = 7; // 쓰기 가능이 false이므로 값을 변경할 수 없습니다. obj.num 삭제; // configurable이 false이므로 삭제할 수 없습니다. console.log(obj.num);//아직 존재하며 5입니다.
const num = 5;
num  ;//illegal reassignment of constant
이 예에서는 새 속성이 정의되지만 기존 속성에 정의 속성()을 사용할 수도 있습니다. "configurable"이 이전에 false로 설정된 경우 true로 변경할 수 없지만, 원래 true였던 경우 이 변경 사항은 구성 유형으로 간주되므로 false로 설정할 수 있습니다.

결론

대부분의 경우 객체가 불변임을 보장할 필요는 없습니다. 그러한 필요가 발생할 경우 일반적으로 개체를 고정하는 것만으로도 충분하지만, 그러한 필요가 발생할 경우 더 세밀하게 제어할 수 있는 추가 옵션이 있습니다.

릴리스 선언문 이 글은 https://dev.to/chooking/object-mutability-in-javascript-1nk4?1에서 복제됩니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3