Koans-06_Types-part2


  • 原始資料型
  • (1)元のデータ型は値そのものを変更できない.
    let name = 'codestates';
    console.log(name) // 'codestates'
    console.log(name.toUpperCase())// 'CODESTATES'
    하지만 원본은 바뀌지 않는다.
    console.log(name)// 'codestates'
    
    재할당은 가능합니다.
    name = name.toUpperCase();
    console.log(name) // 'CODESTATES'
    (2)元のデータ型を変数に割り当てると,値そのもののコピーが発生する.
    let overTwenty = true; (3) false로 바뀜
    let allowedToDrink = overTwenty; // (1) 복사가 일어남. (4) 바뀌지 않음)
    
    overTwenty = false; (2) 변수에 재할당
    console.log(overTwenty)//false;
    console.log(allowedToDrink)//true;
    
    let variable = 'variable';
    let variableCopy = 'variableCopy'; (2)'variable'바뀜
    variableCopy = variable; (1) 복사가 일어남
    variable = variableCopy; (3) 'variable'바뀐 상태로 재할당
    console.log(variable)//'variable';
    (3)元のデータ型または元のデータ型のデータを関数のパラメータとして渡すと,値自体のコピーが発生する.
    let currentYear = 2020;
    
    function afterTenYears(year) {
        year = year + 10;
    }// currentYear 2020 
        
    afterTenYears(currentYear);
    console.log(currentYear)//2020;
        
    function afterTenYears2(currentYear) {
      currentYear = currentYear + 10;
      return currentYear;
    }  
    let after10 = afterTenYears2(currentYear);
    console.log(currentYear)2020;
    console.log(after10)2030;
    사실 함수의 인자도 변수에 자료(data)를 할당하는 것입니다.
    함수를 호출하면서 넘긴 인자가 호출된 함수의 지역변수로 (매 호출 시마다) 새롭게 선언됩니다.  
    ---
    만약
    function afterTenYears2() {
      currentYear = currentYear + 10;
      return currentYear;
    }
    
    let after10 = afterTenYears2();
    // or
    afterTenYears2();
    함수의 인자가 없는 상태 였다면, 함수에 변수가 없는것 입니다. 
    그래서 스코프를 통해서 전역변수를 찾아 전역변수를 바꿉니다.
    console.log(currentYear)2030;
    console.log(after10)2040;
  • 参考資料型
  • (1)参照資料型データは動的データとなる.
    (2)参照データ型を変数に割り当てると、データのアドレスが格納される.
    const overTwenty = ['hongsik', 'minchul', 'hoyong'];
    let allowedToDrink = overTwenty; // 데이터 주소를 공유 한다.
    
    overTwenty.push('san');
    expect(allowedToDrink).to.deep.equal(['hongsik', 'minchul', 'hoyong', 'san']);
    overTwenty[1] = 'chanyoung';
    expect(allowedToDrink[1]).to.deep.equal('chanyoung');
    deep.equalは、配列内の要素またはオブジェクトのプロパティが同じかどうかを確認するマッチングです.

  • deep.なぜequalを使うのか
  • の数値、文字列、ブール値、null値、および未定義の値を予想通りに比較します.1==1、「a」=「a」など.値について、==と==の違いは、==まずタイプを変換しようとすることです.これは「1」==1ではなく、「1」==1です.
  • 反対に、配列はオブジェクトです.この場合、==および==は、演算子によって同じオブジェクトが参照されることを意味しません.
    ソース:https://pythonq.com/so/javascript/46433
    const ages = [22, 23, 27];
        allowedToDrink = ages;
        expect(allowedToDrink === ages).to.equal(true);
        expect(allowedToDrink === [22, 23, 27]).to.equal(false);
    
        const nums1 = [1, 2, 3];
        const nums2 = [1, 2, 3];
        expect(nums1 === nums2).to.equal(false);
    
        const person = {
          son: {
            age: 9,
          },
        };
    
        const boy = person.son;
        boy.age = 20;
        expect(person.son.age).to.equal(20);
        expect(person.son === boy).to.equal(true);
        expect(person.son === { age: 9 }).to.equal(false);
        expect(person.son === { age: 20 }).to.equal(false);
    const nums1 = [1, 2, 3]; const nums2 = [1, 2, 3]; expect(nums1 === nums2).to.equal(false);配列nums 1と配列num 2は、同じデータ[1, 2, 3]を含むが、両者は異なることは明らかである.
    実際、変数num 1とnum 2は配列ではありません.
    参照タイプの変数はアドレスのみを格納します.
    正確には、変数num 1は、データ[1, 2, 3]を格納するメモリ空間(heap)のアドレスを含む.const nums1 = [1, 2, 3]; //[1, 2, 3]はheapに格納され、この位置のアドレスは変数num 1に格納される.const nums2 = [1, 2, 3]; //
    [1,2,3]heapに格納され、この位置のアドレスは変数num 2に格納される.
    heapは、変数num 1およびnum 2に格納される2つの[1, 2, 3]を格納するようになった.
    ソース:コードステータス