25.オブジェクトの元のタイプ


オブジェクトタイプは元のタイプに変換できます.
たとえば、オブジェクト間でプラスまたはマイナスを行います.alertでオブジェクトをパラメータとして配置します.
この場合、自動変換が発生します.
オブジェクトは元の値に変換され、演算が実行されます.
  • オブジェクトのブールタイプは無条件trueです.
  • したがって,オブジェクトを文字と数字の形に変換することが想像できる.
  • に変換された数値形式は、オブジェクト間で数学的相関演算または関数が記録されたときに発生します.
  • 字型への変換は、alertのパラメータに変換されたように、出力対象時に発生する.
  • オリジナル


    オブジェクト型変換はhintを基準として3種類に分類される.hintは「目標に基づいた資料型」と理解できる.

    "string"


    所望の文字列の演算を実行する場合はhint = stringである.
    alert(obj); // 객체를 출력
    
    defObj[obj] = 123; // 객체를 프로퍼티 키로 사용

    "number"


    数学演算を適用する場合はhint = numberです.
    let num = Number(obj); // 숫자형으로 명시적 형 변환
    
    let n = +obj; // 단항 덧셈 연산으로 자동 형 변환
    let difDate = date1 - date2; // 객체의 뺄셈
    
    let samll = user1 < user2; // 비교 연산

    "default"


    資料型が不確定な場合はhint = defaultである.+演算子を使用してこの加算を行うと、
    文字列のプラス記号であっても、数値のプラス記号であってもよい.
    したがって、オブジェクト間を加算するとdefaultとなる.
    また、等しい演算子==を使用すると、オブジェクトをなぜデータ型に変換するのか分からないため、defultとなる.
    let total = obj1 + obj2; // default
    let (user === 1); // default

    Symbol.toPrimitive


    JavaScriptには、Symbol.toPrimitiveという内蔵要素が含まれています.
    この構成部品は、ターゲットの名前を付けるデータ型(hint)に使用されます.
    obj[Symbol.toPrimitive] = function(hint) {
      // 원시값을 반환
      // hint는 "string", "number", "default"중 하나
    };
    以下に、オブジェクト-元の変換方法の一例を実施する
    let user = {
      name: "quakka",
      money: 1000,
      [Symbol.toPrimitive](hint) {
        alert(`hint: ${hint}`);
        return hint == "string" ? `{name: "${this.name}"}` : this.money;
      }
    };
    
    // testCase
    alert(user); // hint: string -> {name: "jogn"}
    alert(+user); // hint: number -> 1000
    alert(user + 500); // hint: default -> 1500

    toStringとvalueOf


    素子が生成される前に、toStringおよびvalueOfを直接使用して変形した.
    オブジェクト上のSymbol.TOPrimitiveがない場合は、次のルールに従って呼び出します.
  • hint"string":toString->valueOfシーケンス
  • その他:valueOf->toStringシーケンス
  • これらのメソッドは元の値を返さなければなりません.オブジェクトを返すと、結果は無視されます.方法が効かないように・・・
    一般オブジェクトは次の規則に従います.
  • toStringは、「[objectObject]」
  • を返します.
  • valueOfは、オブジェクト自体
  • を返す.
    let user = {
      name: 'Quakka'
    };
    alert(user); // [object Object]
    alert(user.valueOf() === user); //true
    上記の概念を用いて同様に実施する例では、
    let user = {
      name: "Quakka",
      money: 50000,
    
      toString() {
        return `{name: "${this.name}"}`;
      },
    
      valueOf() {
        return this.money;
      }
    
    };
    
    alert(user); // toString -> {name: "John"}
    alert(+user); // valueOf -> 50000
    alert(user + 500); // valueOf -> 50500
    Symbol.TOPrimitiveとvalueOfがない場合、toStringはすべてのタイプ変換を処理します.

    追加フォーマットのコピー


    演算子が*である場合、演算子は숫자형に変換される.
    オブジェクトが被演算子の場合、次の手順に従います.
    1.オブジェクトがオリジナルになります.
    2.変換後、元の値が必要な形状でない場合は、再び明示的な変換となります.
    let obj = {
      toString() {
        return "19";
      }
    };
    
    console.log(obj * 2); // 4
  • obj*2でobjはオリジナルに変換され、toStringで"2"に戻ります.
  • 「2」*2は、文字に数字を乗じた望ましくない形式である.
    だから「2」をさらに数字型に変えて2*2にしました.
  • *ではなく+であれば、「22」は結果値である.