가변성은 값을 변경하는 능력입니다. 변경 가능한 값은 변경될 수 있고 변경 불가능한 값은 변경될 수 없습니다. 일반적인 오해는 "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 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!