JS | Object : assign(), freeze()


「可変」(Immutability)とは、オブジェクトの作成後に変更できないようにすることです.
オブジェクトは、元のタイプとは異なる変更可能な値で参照(reference)として渡されます.共有オブジェクトの参照値の形式であるため、オブジェクトの値を変更すると、参照する他の場所が変更されます.
このとき、予期せぬ変更を防止するのは、不変のデータパターンです.オブジェクト自体を不変のオブジェクトとして作成するか、オブジェクトを変更する必要がある場合にコピーを作成して値を変更します.
  • オブジェクトの防御コピー(防御コピー)Object.assign
  • 可変オブジェクトObject.freeze
  • 1.不変オブジェクトの変更
    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()