[生活コード]JavaScript不変性-2.ふへんかんすう


生活コードのJavaScript Immutability講義をまとめたもの.
2.不変関数
2-1. 不変関数の作成
JavaScriptの関数は、パラメータのパラメータが元のデータ型とオブジェクトである場合の動作が異なります.
オブジェクトが関数のパラメータとして渡され、オブジェクト自体(元)のプロパティ値(元のタイプ、string)が変更された場合:
function fn(person){
	person.name = 'lee';
}
var o1 = {name:'kim'};
fn(o1);
console.log(o1); // {name: "lee"}
オブジェクトが関数のパラメータとして渡され、それ自体(元)のプロパティ値(元のタイプ、string)が変わらない場合:
パラメータとして渡すオブジェクト
  • 関数にコピーする
  • 複製オブジェクトのプロファイル
  • を変更する.
    変更されたオブジェクト
  • を返します.
  • 関数を使用して、返されたオブジェクトを新しい変数に割り当てます.
    function fn(person){
    	person = Object.assign({}, person); // 함수 내부에서 인자로 전달받은 객체를 복사
    	person.name = 'lee'; // 복사한 객체의 프로퍼티를 수정
    	return person; // 수정한 객체를 리턴
    }
    var o1 = {name:'kim'};
    var o2 = fn(o1); // 리턴 받은 객체를 새로운 변수에 할당
    console.log(o1, o2); // {name: "kim"} {name: "lee"}
    オブジェクトが関数のパラメータとして渡され、それ自体(元のタイプ、string)の値が変わらない場合は、2:
  • 関数に渡されたオブジェクトをコピーし、新しい変数
  • に割り当てます.
  • 新しい変数を関数のパラメータとして
  • に渡す
    function fn(person){
    	person.name = 'lee';
    }
    var o1 = {name:'kim'};
    var o2 = Object.assign({}, o1); // 원본 객체를 복제하여 새로운 변수에 할당
    fn(o2); // 복제된 객체가 담긴 변수를 함수에 전달
    console.log(o1, o2); // {name: "kim"} {name: "lee"}
    2-2. 可変APIと不変APIの比較
    JavaScriptのAPIで可変ソースを処理するAPIと、可変ソースを処理するAPIを比較することで、「4.可変関数の作成」で見たメカニズムが実際にどのように現実的に実現されているのか、ARABOZA.
    元のオブジェクトを変更する場合
    var score = [1,2,3];
    score.push(4);
    console.log(score); // [1, 2, 3, 4]
    ソースオブジェクトをコピーして、ソースの不変性を維持します.
    var score = [1,2,3];
    // score.push(4);
    var score2 = score.concat(4);
    console.log(score, score2); // [1, 2, 3] [1, 2, 3, 4]
    元のオブジェクトを変更する場合は、次のようになります.
  • 多くの変数は同じソースオブジェクトを参照し、すべての変更が必要な場合は
  • var score = [1,2,3];
    var a = score;
    var b = score;
    var c = score;
    // 수 많은 변수들이 객체(배열) score를 참조 ...
    score.push(4);
    console.log(score, a, b, c); // [1, 2, 3, 4] [1, 2, 3, 4] [1, 2, 3, 4] [1, 2, 3, 4]
    元のオブジェクトの不変性を維持するのに役立つ場合:
  • 同じソースオブジェクトを参照する変数は多く、値は
  • に変更できません.
  • ただし、元のオブジェクトの値を変更して使用する場合は、
  • と入力します.
    var score = [1,2,3];
    var a = score;
    var b = score;
    var c = score;
    // 수 많은 변수들이 객체(배열) score를 참조 ...
    // score.push(4);
    var score2 = score.concat(4);
    console.log(score, score2, a, b, c); // [1, 2, 3] [1, 2, 3, 4] [1, 2, 3] [1, 2, 3]
    JavaScriptでは、不変性とパフォーマンスの間にtrade-off関係が確立されています.
  • ソースオブジェクトをコピーすることで、ソースオブジェクトの不変性を維持できます.しかし、性能が損なわれる.
  • 元のオブジェクトを変更すると、パフォーマンスが向上します.しかし、コードは予想外の動作をする可能性があります.
  • 要するに、状況に応じて長所を伸ばし短所を避けなければならない.