const로 상수를 관리하는 건 좋지 않아!?값을 바꾸는 것을 금지하는 유일한 방법!
8896 단어 ObjectconstJavaScript상수
개요
・const는 대입할 수 없지만 참고형은 변경할 수 있습니다
· 참조형은 Object입니다.프리즈 방법으로 변하지 않는 값이 될 수 있어요.
const 변경 가능
우선const로 상수를 정의하면 대입, 재선언이 불가능하다.
따라서 다음 코드는 "Typerer: Assignment to constant variable"입니다.이런 오류가 발생했습니다.
상수를 변경할 수 없는 예.jsconst teisu = "定数です。"
teisu = "変更しました" //エラー発生
console.log(teisu)
그러나const는 더 이상 대입할 수 없고 속성의 일부분만 바꿀 수 있습니다.
상수를 변경할 수 있는 예.jsconst teisu = ["定数です。"]
teisu[0] = "変更しました"
console.log(teisu[0]) //「変更しました」が出力
왜 const를 변경할 수 있습니까?
왜 String은 변경할 수 없지만 그룹의 요소를 변경할 수 있습니까?
이것은 두 가지 데이터 유형과 관계가 있다.
・기본형(원시형)
참조형
이 두 종류의 수치 저장 방법은 다르다.
기본형은 수치를 직접 저장하고 참조형은 상수를 저장하는 주소입니다.
・기본형→저장치
참조형→저장주소
상수는 값을 변경할 수 없습니다.따라서 기본형이 바뀌면 오류가 발생할 수 있다.
그러나 참조형은 주소를 변경하지 않고 주소가 지정한 값을 변경했기 때문에 변경할 수 있다.
참조 유형 수정을 어떻게 금지합니까?
앱을 만들면 상수 파일을 준비해 공통의 값을 관리하고 싶은 일이 있다.이 경우 참조 수치를 유지하려는 경우도 있습니다.
그러나 참조 유형은 const 정의를 사용하여 변경할 수도 있습니다.그러면 원래 목적이 변하지 않는 값을 유지할 수 없다.
어떻게 하면 좋을까요?
이 문제를 해결한 사람은 Object입니다.freeze 방법.
이 방법을 사용하여 정의하면 속성 변경, 추가, 삭제를 해도 내용이 반영되지 않습니다.
다음 원본에서 원본에서 수조에 정의된 값을 수정했지만 출력 값이 바뀌지 않았습니다.
freeze 방법으로 변경을 금지합니다.jsconst teisu = Object.freeze(["定数です。"])
teisu[0] = "変更しました"
console.log(teisu[0]) //「定数です。」が出力
또한 Strict 모드로 설정하면 Typereror 오류가 발생할 수 있습니다.
이렇게 하면 테스트 단계에서 개작 상수의 처리를 제거하고 쓸모없는 기술을 줄여 가독성을 높일 수 있다.
strict 모드 오류입니다.js"use strict"
const teisu = Object.freeze(["定数です。"])
teisu[0] = "変更しました" //エラー発生
console.log(teisu[0])
하지만 Object.freeze 방법을 사용하는 데는 주의가 필요하다.이 방법은 Object 바로 아래의 속성에만 적용됩니다.
따라서 네스트된 속성의 값을 수정할 수 있습니다.
중첩된 속성은 변경할 수 있습니다.jsconst teisu = Object.freeze(["定数です。", ["定数の中の値"]])
teisu[1][0] = "変更しました"
console.log(teisu[1][0]) //"変更しました"
이 문제를 해결하기 위해 공식적으로 deepFreeze 방법을 소개했다.
이 방법을 사용하면 중첩된 값도 변경할 수 없습니다.
중첩된 속성도 변경할 수 없습니다.jsfunction deepFreeze(object) {
// オブジェクトで定義されたプロパティ名を取得
var propNames = Object.getOwnPropertyNames(object);
// 自分自身を凍結する前にプロパティを凍結
for (let name of propNames) {
let value = object[name];
//「値がある かつ オブジェクト型」の場合、freezeを適用
object[name] = value && typeof value === "object" ?
deepFreeze(value) : value;
}
return Object.freeze(object);
}
var obj2 = {
internal: {
a: null
}
};
deepFreeze(obj2);
obj2.internal.a = 'anotherValue'; // 非 strict モードでは暗黙に失敗
obj2.internal.a; // null
참고 자료
MDN web docs
Reference
이 문제에 관하여(const로 상수를 관리하는 건 좋지 않아!?값을 바꾸는 것을 금지하는 유일한 방법!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/syu_ikeda/items/dfe00744f084e4ccb953
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
우선const로 상수를 정의하면 대입, 재선언이 불가능하다.
따라서 다음 코드는 "Typerer: Assignment to constant variable"입니다.이런 오류가 발생했습니다.
상수를 변경할 수 없는 예.js
const teisu = "定数です。"
teisu = "変更しました" //エラー発生
console.log(teisu)
그러나const는 더 이상 대입할 수 없고 속성의 일부분만 바꿀 수 있습니다.상수를 변경할 수 있는 예.js
const teisu = ["定数です。"]
teisu[0] = "変更しました"
console.log(teisu[0]) //「変更しました」が出力
왜 const를 변경할 수 있습니까?
왜 String은 변경할 수 없지만 그룹의 요소를 변경할 수 있습니까?
이것은 두 가지 데이터 유형과 관계가 있다.
・기본형(원시형)
참조형
이 두 종류의 수치 저장 방법은 다르다.
기본형은 수치를 직접 저장하고 참조형은 상수를 저장하는 주소입니다.
・기본형→저장치
참조형→저장주소
상수는 값을 변경할 수 없습니다.따라서 기본형이 바뀌면 오류가 발생할 수 있다.
그러나 참조형은 주소를 변경하지 않고 주소가 지정한 값을 변경했기 때문에 변경할 수 있다.
참조 유형 수정을 어떻게 금지합니까?
앱을 만들면 상수 파일을 준비해 공통의 값을 관리하고 싶은 일이 있다.이 경우 참조 수치를 유지하려는 경우도 있습니다.
그러나 참조 유형은 const 정의를 사용하여 변경할 수도 있습니다.그러면 원래 목적이 변하지 않는 값을 유지할 수 없다.
어떻게 하면 좋을까요?
이 문제를 해결한 사람은 Object입니다.freeze 방법.
이 방법을 사용하여 정의하면 속성 변경, 추가, 삭제를 해도 내용이 반영되지 않습니다.
다음 원본에서 원본에서 수조에 정의된 값을 수정했지만 출력 값이 바뀌지 않았습니다.
freeze 방법으로 변경을 금지합니다.jsconst teisu = Object.freeze(["定数です。"])
teisu[0] = "変更しました"
console.log(teisu[0]) //「定数です。」が出力
또한 Strict 모드로 설정하면 Typereror 오류가 발생할 수 있습니다.
이렇게 하면 테스트 단계에서 개작 상수의 처리를 제거하고 쓸모없는 기술을 줄여 가독성을 높일 수 있다.
strict 모드 오류입니다.js"use strict"
const teisu = Object.freeze(["定数です。"])
teisu[0] = "変更しました" //エラー発生
console.log(teisu[0])
하지만 Object.freeze 방법을 사용하는 데는 주의가 필요하다.이 방법은 Object 바로 아래의 속성에만 적용됩니다.
따라서 네스트된 속성의 값을 수정할 수 있습니다.
중첩된 속성은 변경할 수 있습니다.jsconst teisu = Object.freeze(["定数です。", ["定数の中の値"]])
teisu[1][0] = "変更しました"
console.log(teisu[1][0]) //"変更しました"
이 문제를 해결하기 위해 공식적으로 deepFreeze 방법을 소개했다.
이 방법을 사용하면 중첩된 값도 변경할 수 없습니다.
중첩된 속성도 변경할 수 없습니다.jsfunction deepFreeze(object) {
// オブジェクトで定義されたプロパティ名を取得
var propNames = Object.getOwnPropertyNames(object);
// 自分自身を凍結する前にプロパティを凍結
for (let name of propNames) {
let value = object[name];
//「値がある かつ オブジェクト型」の場合、freezeを適用
object[name] = value && typeof value === "object" ?
deepFreeze(value) : value;
}
return Object.freeze(object);
}
var obj2 = {
internal: {
a: null
}
};
deepFreeze(obj2);
obj2.internal.a = 'anotherValue'; // 非 strict モードでは暗黙に失敗
obj2.internal.a; // null
참고 자료
MDN web docs
Reference
이 문제에 관하여(const로 상수를 관리하는 건 좋지 않아!?값을 바꾸는 것을 금지하는 유일한 방법!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/syu_ikeda/items/dfe00744f084e4ccb953
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
앱을 만들면 상수 파일을 준비해 공통의 값을 관리하고 싶은 일이 있다.이 경우 참조 수치를 유지하려는 경우도 있습니다.
그러나 참조 유형은 const 정의를 사용하여 변경할 수도 있습니다.그러면 원래 목적이 변하지 않는 값을 유지할 수 없다.
어떻게 하면 좋을까요?
이 문제를 해결한 사람은 Object입니다.freeze 방법.
이 방법을 사용하여 정의하면 속성 변경, 추가, 삭제를 해도 내용이 반영되지 않습니다.
다음 원본에서 원본에서 수조에 정의된 값을 수정했지만 출력 값이 바뀌지 않았습니다.
freeze 방법으로 변경을 금지합니다.js
const teisu = Object.freeze(["定数です。"])
teisu[0] = "変更しました"
console.log(teisu[0]) //「定数です。」が出力
또한 Strict 모드로 설정하면 Typereror 오류가 발생할 수 있습니다.이렇게 하면 테스트 단계에서 개작 상수의 처리를 제거하고 쓸모없는 기술을 줄여 가독성을 높일 수 있다.
strict 모드 오류입니다.js
"use strict"
const teisu = Object.freeze(["定数です。"])
teisu[0] = "変更しました" //エラー発生
console.log(teisu[0])
하지만 Object.freeze 방법을 사용하는 데는 주의가 필요하다.이 방법은 Object 바로 아래의 속성에만 적용됩니다.따라서 네스트된 속성의 값을 수정할 수 있습니다.
중첩된 속성은 변경할 수 있습니다.js
const teisu = Object.freeze(["定数です。", ["定数の中の値"]])
teisu[1][0] = "変更しました"
console.log(teisu[1][0]) //"変更しました"
이 문제를 해결하기 위해 공식적으로 deepFreeze 방법을 소개했다.이 방법을 사용하면 중첩된 값도 변경할 수 없습니다.
중첩된 속성도 변경할 수 없습니다.js
function deepFreeze(object) {
// オブジェクトで定義されたプロパティ名を取得
var propNames = Object.getOwnPropertyNames(object);
// 自分自身を凍結する前にプロパティを凍結
for (let name of propNames) {
let value = object[name];
//「値がある かつ オブジェクト型」の場合、freezeを適用
object[name] = value && typeof value === "object" ?
deepFreeze(value) : value;
}
return Object.freeze(object);
}
var obj2 = {
internal: {
a: null
}
};
deepFreeze(obj2);
obj2.internal.a = 'anotherValue'; // 非 strict モードでは暗黙に失敗
obj2.internal.a; // null
참고 자료
MDN web docs
Reference
이 문제에 관하여(const로 상수를 관리하는 건 좋지 않아!?값을 바꾸는 것을 금지하는 유일한 방법!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/syu_ikeda/items/dfe00744f084e4ccb953
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(const로 상수를 관리하는 건 좋지 않아!?값을 바꾸는 것을 금지하는 유일한 방법!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/syu_ikeda/items/dfe00744f084e4ccb953텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)