第11章.元の値とオブジェクトの比較

7065 ワード


元のタイプ

  • データ型を元のタイプとオブジェクトタイプに分割する理由
    1)元のタイプの値は可変値であり、オブジェクトタイプの値は可変値である.
    2)元の値が変数に割り当てられている場合、変数(メモリ領域が確保されている)は実際の値を格納し、オブジェクトが変数に割り当てられている場合、変数(メモリ領域が確保されている)は参照値を格納します.
    3)元の値を持つ変数を他の変数に割り当てると、元の値がコピーされて渡されます.(値によって渡される)ただし、オブジェクトを指す変数を他の変数に割り当てると、元の参照値がコピーされて渡されます.(参照転送)
  • 11.1元の値


    11.1.1不変値


    元の値は、変更できない読み取り専用値です.元の値は何があっても変わらない.これらの元の値の特性は、データの信頼性を保証します.
    不変性を持つ元の値を割り当てる変数は、再割り当て以外に変数値を変更する方法はありません.

    11.1.2文字列と不変性


    文字列は配列に似たオブジェクトであり、iterableでもあるため、配列のように各文字にアクセスできます.ただし、文字列は元の値であり、変更できません.
    let str = 'hello';
    
    str[0] = "H"
    console.log(str) // "hello"

    11.1.3転送

    let score = 80;
    let copy = score;
    
    console.log(score, copy); // 80 80
    console.log(score === copy); // true
    
    score = 100;
    
    console.log(score, copy); // 100 80
    console.log(score === copy); // false
    copy変数はscore変数の値80をコピーして割り当てられます.scoreとcopyの値はそれぞれ異なるメモリ領域に格納されるため、scoreの値を変更してもcopy値には影響しません.
    「値別転送」はJavaScriptの用語ではありません.厳密には、変数は値を渡すのではなくメモリアドレスを渡します.変数のような識別子は、値がアミラのメモリアドレスを覚えている.

    11.2オブジェクト


    オブジェクトの数が不確定で、動的に追加および削除できます.JavaScriptは、オブジェクトをクラスなしに作成し、オブジェクトを作成した後にPropertyとメソッドを動的に追加できます.

    11.2.1変更可能な値


    元の値は変更できない値なので、元の値を変更するには、再割り当て以外に方法はありません.ただし、オブジェクトは変更可能な値です.したがって、オブジェクトを割り当てる変数は、再割り当てすることなく、オブジェクトを直接変更できます.
    let person = {
      name: 'john'
    }
    
    person.name = 'kim'
    person.age = 20
    person.address = 'seoul'
    
    console.log(person) // { name: 'kim', age: 20, address: 'seoul' }
    オブジェクトの作成、管理は複雑でコストがかかります.また、メモリを効率的に使用するために、オブジェクトは変更可能な値に設計されています.
    しかし、元の値とは異なり、複数の識別子が1つのオブジェクトを共有できるため、構造上の欠点がある.
    浅い放射vs深い放射
    浅い複製と深い複製で生成されるオブジェクトは、元のオブジェクトとは異なります.ただし、浅いレプリケーションの違いは、オブジェクトがネストされている場合は参照値がレプリケートされ、深いレプリケーションではオブジェクトにネストされているすべてのオブジェクトがレプリケーションされ、元の値と同じ完全なコピーが作成されます.
    11.2.2参照転送
    オブジェクトを指す変数を別の変数に割り当てると、元のオブジェクトの参照値がコピーされて渡されます.これを参照転送と呼びます.
    let person = {
      name: 'john'
    }
    
    let copy = person;
    上記の例では、元の参照値がコピーされて渡されます.2つの識別子が1つのオブジェクトを共有します.
    let person = {
      name: "john"
    };
    
    let copy = person;
    
    console.log(copy === person); // true
    
    copy.age = 20;
    person.address = "seoul";
    
    console.log(copy); //{ name: 'john', age: 20, address: 'seoul' }
    console.log(person); //{ name: 'john', age: 20, address: 'seoul' }
    したがって、上記と同じオブジェクトを共有することで、どちらのオブジェクトを変更しても相互に影響します.