JS | Object : assign(), freeze()
8505 ワード
「可変」(Immutability)とは、オブジェクトの作成後に変更できないようにすることです.
オブジェクトは、元のタイプとは異なる変更可能な値で参照(reference)として渡されます.共有オブジェクトの参照値の形式であるため、オブジェクトの値を変更すると、参照する他の場所が変更されます.
このとき、予期せぬ変更を防止するのは、不変のデータパターンです.オブジェクト自体を不変のオブジェクトとして作成するか、オブジェクトを変更する必要がある場合にコピーを作成して値を変更します.オブジェクトの防御コピー(防御コピー) 可変オブジェクト 1.不変オブジェクトの変更
Object.freeze(obj)
パラメータとしてフリーズするオブジェクトを受信し、関数に渡すオブジェクトを返します.
フリーズ後に変更しようとすると、こっそり無視されますが、厳密モードではタイプエラーが発生します.
Object.assign(target, ...sources)
ターゲットオブジェクトとソースオブジェクトをパラメータとして受信し、ソースオブジェクトのコピーをターゲットオブジェクトと結合する方法.ターゲットオブジェクトにソースオブジェクトのプロパティと同じプロパティがある場合は、ソースオブジェクトのプロパティ値で上書きされます.実行後にターゲットオブジェクトに戻ります.
最初のパラメータはターゲットオブジェクトとして認識され、主に空のオブジェクト
poiemaweb|5.11オブジェクトと変更不可性
MDN | Object.freeze()
オブジェクトは、元のタイプとは異なる変更可能な値で参照(reference)として渡されます.共有オブジェクトの参照値の形式であるため、オブジェクトの値を変更すると、参照する他の場所が変更されます.
このとき、予期せぬ変更を防止するのは、不変のデータパターンです.オブジェクト自体を不変のオブジェクトとして作成するか、オブジェクトを変更する必要がある場合にコピーを作成して値を変更します.
Object.assign
Object.freeze
Object.freeze(obj)
.freeze()
オブジェクトをフリーズして変更できません.フリーズされたオブジェクトはpropertyの値を変更することはできません.また、新しいpropertyを追加または削除することはできません.ただし、deep freezeがないため、オブジェクト内のオブジェクトは変更可能です.パラメータとしてフリーズするオブジェクトを受信し、関数に渡すオブジェクトを返します.
フリーズ後に変更しようとすると、こっそり無視されますが、厳密モードではタイプエラーが発生します.
const user1 = {
name: 'lee',
address: {
city: "seoul"
}
};
Object.freeze(user1);
user1.name = 'kims';
user1.address.city = 'Busan';
console.log(Object.isFrozen(user1)); // true
console.log(user1.name); // 'lee'
// deep freeze되지 않는다.
console.log(user1.address.city) // 'Busan'
// 배열 동결
let arr = [1, 2];
Object.freeze(arr);
arr[0] = 3;
arr.push(3); // TypeError
console.log(Object.isFrozen(arr)); // true
console.log(arr); // [1, 2]
2.防御的複製オブジェクトObject.assign(target, ...sources)
ターゲットオブジェクトとソースオブジェクトをパラメータとして受信し、ソースオブジェクトのコピーをターゲットオブジェクトと結合する方法.ターゲットオブジェクトにソースオブジェクトのプロパティと同じプロパティがある場合は、ソースオブジェクトのプロパティ値で上書きされます.実行後にターゲットオブジェクトに戻ります.
最初のパラメータはターゲットオブジェクトとして認識され、主に空のオブジェクト
{}
がパラメータとして伝達される..assign()
は深度コピーを行わないため、オブジェクト内のオブジェクトは保護されません.const user1 = {
name : 'lee',
address : {
city : 'seoul'
}
};
const user2 = Object.assign({}, user1);
// 다른 레퍼런스를 참조한다.
console.log(user1 === user2) // false
user2.name = 'kim';
user2.address.city = 'Busan';
console.log(user1.name); // 'lee'
console.log(user2.name); // 'kim'
// 내부 객체는 shallow copy된다.
console.log(user1.address.city) // 'Busan'
console.log(user2.address.city) // 'Busan'
リファレンスpoiemaweb|5.11オブジェクトと変更不可性
MDN | Object.freeze()
Reference
この問題について(JS | Object : assign(), freeze()), 我々は、より多くの情報をここで見つけました https://velog.io/@fa0o00/JS-객체와-변경불가성-assign-freezeテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol