1.データ型


1-1データ型


✔¥ベーシック(オリジナル、オリジナル)¥値のダイレクトコピー
  • number
  •   const num = 33;
      const infinity = 1 / 0; // Infinity
      const negativeinfinity = -1 / 0; // -Infinity
      const nAn = Number("hi"); // NaN
    
      console.log(typeof num); // "number"
      console.log(typeof infinity); // "number"
      console.log(typeof negativeinfinity); // "number"
      console.log(typeof nAn); // "number"
  • string
  •     const str1 = "문자열"; 
        const str2 = 'string';
        const str3 = str1 + str2 + 3; // "문자열string3"
    
        console.log(typeof str1); // "string"
        console.log(typeof str2); // "string"
        console.log(typeof str3); // "string"
  • boolean ( true/false )
  •     //falsy값 제외하고 전부 truthy이므로 falsy를 기억하자
        0, -0, "", '', NaN, null, undefined, false
  • null
  • undefined
  • symbol
  • ✔¥参照型(オブジェクト、reference type)¥値を含む柱状値からなる束の柱状値をコピー
  • object
  • array
  • function
  • ▼▼▼▼▼対象の元データ?
    パッキンオブジェクトを提供し、元のデータをオブジェクトと見なすことができます.

    1-2データ型の背景知識


    1-2-1メモリとデータ


    bit:2個の値(0または1)、byte:2**8個の値

  • JavaScriptメモリの管理
    C、javaなどの静的タイプの言語では、データ型に応じて異なるメモリ領域が割り当てられます.
    たとえば、数値は範囲によって異なり、変数を宣言するときにデータ型を指定する必要があります.
    動的言語JavaScriptは、メモリオーバーフロー値(=バイト単位の識別子)によってデータを区切って接続します.
    JavaScriptは、8バイト(64ビット)の数字を確保します.
  • 1-2-2識別子と変数


    ✔¥変数?可変データを格納できるスペース
    ✔勘定科目識別子?このスペースの名前=変数名

    1~3変数宣言とデータ割当て


    1-3-1変数宣言

    var a; // 변수 선언
    console.log(a); // undefined
  • 変数領域の空白(1)を探します.
  • 空間を指定する識別子はaである.
  • 1-3-2データ割付

    var a; // 변수 선언
    a = "Hi"; // 변수 a에 데이터 할당
  • 変数領域の空白(1)を探します.
  • 空間を指定する識別子はaである.
    **3. データ領域の空白に文字列「Hi」を格納します.
  • 変数領域で識別子aを検索し、その空間に文字列を格納するアドレス@101を入力します.**
  • 1-4基本データおよび参照データ


    1-4-1不変値


    ✔¥不変性?データ領域メモリの変更可能性
    АААААААААААА
    let a = 5; //a는 5라는 데이터를 담는 '식별자'
    a = 7; // 값이 5에서 7로 바뀌는 것이 아니라 식별자 a가 데이터 5의 주소가 아닌 7의 주소를 담게 됨
    //5와 7 데이터는 변하지 않음 =>"immutable"

    1-4-2可変


    ААААААААААААА
    const obj = {
      a: 32,
      b: 'male'
    } // object인 객체는 또 다른 데이터의 주소값을 참조

    1-4-3レプリケーション変数の比較

    // 변수 복사 후 객체의 프로퍼티를 변경 => "참조형 데이터가 가변값"
    let a = "Hi";
    let obj = {
    	age: 32,
    	gender: "male"
    };
    
    let b = a;
    let obj2 = obj1;
    
    b = "Hello";
    obj2.age = 33;
    // 변수 복사 후 객체 자체를 변경
    let a = "Hi";
    let obj = {
    	age: 32,
    	gender: "male"
    };
    
    let b = a;
    let obj2 = obj1;
    
    b = "Hello";
    obj2 = {
    	age: 33,
    	gender:"male"
    }

    1-5オブジェクトを変更しない


    1~5-1の不変オブジェクトを作成する簡単な方法


    АААААААААААААА

    1-5-2浅い放射と深い放射


    ✔¥浅い放射線?次のステップに近い値のみコピー
    ✔¥深い放射線?すべての内部値をすべてコピー=>元の値から完全に参照解除されたオブジェクト
    オブジェクト構成の値がデフォルトの場合はそのままコピーし、参照データが内部構成の場合はそのままコピーします.
    let one = { name: "one" };
    const two = { name: "two" };
    
    const something = one;
    
    one = { name: "ONE" };
    console.log(something); // { name: "one" };
    //객체의 깊은 복사 
    
    let copyObj = function(target) {
    	var result = {};
    	if (typeof target === "object" && target !== null) {
    		for(var prop in target) {
    			result[prop] = copyObj(target[prop]);
    		}
    	} else {
    			result = target;
    	}
    	return result;
    };

    1-6未定義およびnull


    АААААА
    ✔️ undefined? 予期せぬ値が存在しない場合、JavaScriptエンジンによって自動的に付与されます(直接割り当ては避けます)
    ✔️ null? ユーザーは「値なし」を明示します.
    let nullData = null;
    console.log(typeof nullData); // object => js 버그
    
    //동등 연산자 사용
    console.log(nullData == null); //true
    console.log(nullData == undefined); // true
    
    //일치 연산자 사용
    console.log(nullData === null); //true
    console.log(nullData === undefined); // false
    
    //동등연산자 아닌 일치연산자(===) 사용할 것
    // 초기값이 할당되지 않은 변수
    let a;
    console.log(a); // undefined
    
    // 초기값이 할당되지 않은 매개변수
    function foo (a, b) {
      console.log(a); // 1
      console.log(b); // undefined
    }
    foo(1);
    
    // return문이 없거나 호출되지 않은 함수의 실행 결과
    function foo (a, b) {
    	let result = a + b;
    }
    console.log(foo(1, 2)); // undefined
    
    // 객체에서 존재하지 않는 속성을 접근하는 경우
    const student = {
      name: 'jihyun'
    };
    console.log(student.age); // undefined

  • var, let, const
    ✔¥varとlet
  • varはグローバルレンジ(関数役割ドメイン)です.
    let Block Scope:カッコ{}に基づいて役割ドメイン(for loop対応)
  • を作成
  • varで宣言されたグローバル変数は、グローバルオブジェクトのKey/Valueとして追加されます.
    letを使用して宣言されたグローバル変数は、定義されていない
  • です.
            var x = "global";
            let y = "global";
    
            console.log(window.x); // "global"
            console.log(window.y); // undefined

  • var宣言を使用した変数をundefinedに初期化して開始
    let宣言を使用した変数は、宣言実行前に初期値Xである
    初期値が指定されていないlet変数はアクセスできません:temporal dead zone (TDZ)
  •     /* hoisting? 변수 선언문이 해당 scope 내에서 최상위로 끌어올려지는 것
        변수 선언문이 실행되기 전에 undefined로 초기화(실제로 실행되는 것은 아님) */
    
        console.log(a); // undefined
        var a; // 변수선언 + 초기화
        console.log(a); // undefined
        a = 20; // 할당
        console.log(a); // 20
    
        console.log(a) // ReferenceError
        let a; // 변수선언 + 초기화 => 실제 실행 => let변수 접근 가능해짐
        console.log(a); // undefined
        a = 20; // 할당
        console.log(a); // 20
    
        {
         	// This is the temporal dead zone for the age variable!
        	// This is the temporal dead zone for the age variable!
        	// This is the temporal dead zone for the age variable!
         	// This is the temporal dead zone for the age variable!
        	let age = 25; // Whew, we got there! No more TDZ
        	console.log(age);
        }
    
        letconstTDZ? scope의 시작점부터 선언(+초기화) 전까지
        해당 선언문이 실행되기 전까지 초기값이 정해지지 않음
        ```
    
        ✔️ const
    
        - Block Scope: 중괄호{ }를 기준으로 scope 생성
        - '='를 사용한 재할당 불가능
    
     ```javascript
        const obj = {
        	arr: [1,2,3]
        }
        obj = [];           // X
        obj.arr.length = 0; // arr: []
        obj.arr.push(1);    // arr: [1]
    デフォルトではconstを使用し、let(varはX)を再割り当てする必要がある場合は