>웹 프론트엔드 >JS 튜토리얼 >Javascript의 객체 가변성

Javascript의 객체 가변성

王林
王林원래의
2024-07-20 07:44:38984검색

Object Mutability in Javascript

객체 가변성

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

const

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

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

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

const num = 5;
num++;//illegal reassignment of constant

결과 오류는 다음과 같습니다.

Uncaught TypeError: Assignment to constant variable.

const 객체는 변경 가능

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

const obj = {num: 5};
obj.num = 7; //legal
obj = {num: 7}; //illegal reassignment 

객체에는 내부 값을 변경하는 메서드가 있을 수도 있습니다.

const obj = {
    num: 5,
    increment(){
        this.num++;
    }
}
obj.increment();
console.log(obj.num); //6

객체를 불변으로 만들기

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

const obj = {num: 5};
Object.freeze(obj);
obj.num = 7; // doesn't change
console.log(obj.num);// still 5

엄격 모드를 사용하는 경우 num 값을 변경하려고 하면 실제로 다음 오류 메시지와 함께 충돌이 발생할 수 있습니다.

Cannot assign to read only property 'num'

"const" 없이 Object.freeze()를 사용하는 것만으로도 이 객체를 불변으로 만드는 데 충분합니다. 하지만 변수 이름을 변경할 수 없게 만드는 것은 아닙니다.

let obj = {num: 5};
Object.freeze(obj);
obj = {num: 5}; // new object with old name
obj.num = 7; // changes successfully
console.log(obj.num);// 7

이 버전의 코드에서는 obj가 재할당됩니다. 동일한 이름을 공유하는 이전 개체에 동결()이 적용되었지만 새 개체는 동결된 적이 없으므로 변경 가능합니다.

밀봉물체

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

let obj = {num: 5};
Object.seal(obj);
obj.num = 7; // changes
console.log(obj.num);// 7
obj.newValue = 42; //cannot add new property to sealed object
console.log(obj.newValue);//undefined
delete obj.num; //cannot delete property from sealed object
console.log(obj.num);// still exists and is 7

세분화된 제어

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

const obj = {};
Object.defineProperty(obj, 'num',{
    value: 5,
    writable: false,
    configurable: false
});
obj.num = 7; // Cannot change value because writable is false
delete obj.num; // Cannot delete because configurable is false
console.log(obj.num);//Still exists and is 5

이 예에서는 새 속성이 정의되지만, 기존 속성에 정의 프로퍼티()를 사용할 수도 있습니다. "구성 가능"이 이전에 false로 설정된 경우 true로 변경할 수 없지만, 원래 true였던 경우 이 변경 사항은 구성 유형으로 간주되므로 false로 설정할 수 있습니다.

결론

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

위 내용은 Javascript의 객체 가변성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.