JavaScriptベース---強制タイプ変換


一、類型変換規則
1.ToString
一般的なオブジェクトに対しては、toStringメソッドを独自に定義しない限り、Object.prototype.toString()メソッドが起動され、オブジェクトが自分のtoStringメソッドを持っている場合、文字列化はこの方法を呼び出し、その戻り値を使用する.
2.トムumber
  • は、基本タイプのtrueを1に変換し、falseを0に変換する.undefinedはNaNに変換され、nullは0に変換されます.
  • は、オブジェクトタイプに対して、まず基本タイプの値に変換し、非数値の基本タイプの値を返すと、基本タイプの変換規則に従って、強制的に数字に変換する.値を対応する基本的なタイプの値に変換するために、抽象的な動作ToPrimitiveは、最初にこの値がvalueOf()の方法があるかどうかをチェックします.基本タイプ値がある場合は、この値を用いて強制タイプ変換を行います.もしなければ、String()の戻り値(存在すれば)を使って強制タイプ変換を行います.valueOf()とtoString()が基本タイプ値に戻らないとType Errエラーが発生します.
  • let a = {
        valueOf:function(){
            return "42";
        }
    };
    let b = {
        toString:function(){
            return "42";
        }
    };
    let c = [4,2];
    c.toString = function(){
        return this.join(""); //"42"
    };
    
    Number(a);     //42
    Number(b);     //42
    Number(c);     //42
    Number('');    //0
    Number([]);    //0
    Number(["abc"];//NaN
    3.ToBoolean
    JavaScriptの値は、強制的にfalseに変換できる値と、強制的にtrueに変換できる値の2種類に分けられます.偽の値:
  • undefined
  • null
  • false
  • +0、-0、NaN
  • 「」
  • 真の値:上記のリスト以外は真の値として解釈できます.すべてのオブジェクトは真の値です.
    let a1 = new Boolean( false );
    let b1 = new Number( 0 );
    let c1 = new String( "" );
    let d1 = Boolean(a1 && b1 && c1); //true
    
    let a2 = [];
    let b2 = {};
    let c2 = function(){};
    let d2 = Boolean(a2 && b2 && c2); //true
    二、強制タイプ変換の表示
    1.文字列と数字の表示変換
    文字列と数字の間の変換はString(.)とNumber(.)の2つの内部構造関数によって行われます.String(.)とNumber(.)の他に、文字列と数字の間の明示的な変換が可能である.
    let a = 42;
    let b = a.toString();
    let c = "3.14";
    let d = +c;
    b; // "42"
    d; // 3.14
    a.toString()は明示的であるが、ここでは暗黙的な変換が含まれる.String()は42のような基本的なタイプの値には適用されないので、JavaScriptエンジンは自動的に42のパッケージオブジェクトを作成し、オブジェクトに対してtoString()を呼び出すことができる.ここで明示的な変換には暗黙的な変換が含まれている.
    2.ブール値に変換する表示
    let a = "0";
    let b = [];
    let c = {};
    let d = "";
    let e = 0;
    let f = null;
    let g;
    Boolean( a ); // true
    Boolean( b ); // true
    Boolean( c ); // true
    Boolean( d ); // false
    Boolean( e ); // false
    Boolean( f ); // false
    Boolean( g ); // false
    Boolean(.)は明示的ですが、あまり使われていません.明示的強制タイプをブール値に変換する最も一般的な方法は!
    let a = "0";
    let b = [];
    let c = {};
    let d = "";
    let e = 0;
    let f = null;
    let g;
    !!a; // true
    !!b; // true
    !!c; // true
    !!d; // false
    !!e; // false
    !!f; // false
    !!g; // false
    三、暗黙的強制タイプの変換
    1.文字列と数字の間の暗黙的強制型変換
    (1)+演算子
    デジタル加算にも使用できますし、文字列スティッチングにも使用できます.+のうちの一つの操作数が文字列(またはToPrimitiveの抽象的な動作を呼び出して文字列を得る)であれば、文字列スティッチングを実行します.そうでない場合は、数値加算を行います.配列のvalueOf()は単純な基本タイプの値が得られないので、toStering()を呼び出します.したがって、次の例の2つの配列は「1,2」と「3,4」になります.それらをつなぎ合わせて「1,23,4」に戻ります.
    let a = "42";
    let b = "0";
    a + b; // "420"
    
    let c = 42;
    let d = 0;
    c + d; // 42
    
    let x = [1,2];
    let y = [3,4];
    x + y; // "1,23,4"
    +演算子を使って文字列変換ができます.数字と空の文字列「相」+を文字列に変換します.
    let a = 42;
    let b = a + "";
    b; // "42"
    a+「」(暗黙的)と前のStering(a)(明示的)との間に微妙な違いがあるので注意が必要です.
    ToPrimitive抽象的な操作規則によれば、a+「」はaに対してvalueOf()メソッドを呼び出し、ToString抽象的な操作によって戻り値を文字列に変換します.String(a)は直接ToString()を呼び出します.それらが最後に返したのは文字列ですが、aが数値ではなくオブジェクトであれば結果が違ってくる可能性があります.
    let a = {
        valueOf: function() { return 42; },
        toString: function() { return 4; }
    };
    a + "";         // "42"
    String( a );    // "4"
    (2)文字列強制タイプから数値に変換した場合
    -は、デジタル減算演算子ですので、a-0は、aを強制的に数字に変換します.a*1とa/1も使えます.この2つの演算子は数字だけにも適用されますので、このような使い方はあまり見られません.
    let a = [3];
    let b = [1];
    a - b; // 2
    2.暗黙的強制タイプをブール値に変換
    次の場合は、ブール値を暗黙的に強制的に変換します.(1)if(.)文の条件判定式です.
    (2)for(.;;.)ステートメントの条件判定式(2番目).
    (3)while(.)とdo.while(.)のループにおける条件判定式.
    (4)で条件判定式を行います.
    (5)論理演算子(※)と&&(論理和)の左側の演算数(条件判定式として)
    以上の場合、非ブール値はブール値に強制的に変換され、前述のToBoolean抽象的な操作規則に従います.
    四、緩さが等しいと厳格が等しい.
    ==等しい比較で強制的なタイプ変換が許可されます.==は許可されていません.==和==いずれも操作数の種類をチェックします.違いは操作数の種類が違っています.それらの処理方法が違います.
    1.文字列と数字の等しい比較
    let a = 42;
    let b = "42";
    a === b;    // false
    a == b;     // true
    ==強制タイプの変換がないので、a==bはfalseで、42は「42」と同じではない.a==bは、2つの値のタイプが異なると、いずれかまたは両方を強制的にタイプ変換します.変換規則は、(1)Type(x)が数字でType(y)が文字列であれば、x==ToNumber(y)の結果を返します.(2)Type(x)が文字列でType(y)が数字であれば、ToNumber(x)=yの結果を返します.
    2.他のタイプとブールタイプとの等しい比較
    let a = "42";
    let b = true;
    a == b; // false
    変換規則は、(1)Type(x)がブールタイプであれば、ToNumber(x)=yの結果を返します.(2)Type(y)がブールタイプであれば、x==toNumber(y)の結果を返します.
    上記の例ではType(x)はブール値であるため、ToNumber(x)はtrue強制タイプを1に変換し、1="42"に変更しましたが、両者のタイプは依然として違っています."42"は規則により強制タイプに42に変換され、最後に1=42になり、結局falseとなります.
    3.nullとundefinedの間の等しい比較
    (1)xがnullでyがundefinedであれば、結果はtrueとなります.(2)xがnullなら、yは違います. undefinedまたはnullはfalseとなります.(3)xがundefinedでyがnullであれば、結果はtrueとなります.(4)xがundefinedであれば、yは違います. undefinedまたはnullはfalseとなります.
    let a = null;
    let b;
    a == b;     // true
    a == null;  // true
    b == null;  // true
    a == false; // false
    b == false; // false
    a == "";    // false
    b == "";    // false
    a == 0;     // false
    b == 0;     // false
    
    4.オブジェクトとオブジェクト以外の等しい比較
    (1)Type(x)が文字列または数字である場合、Type(y)がオブジェクトである場合、x==ToPrimitive(y)の結果を返します.(2)Type(x)が対象で、Type(y)が文字列または数字である場合、ToPromitive(x)=yの結果を返します.
    let a = 42;
    var b = [ 42 ];
    a == b; // true
    [42]まずToPromitiveの抽象的な操作を呼び出し、「42」に戻り、「42」==42になり、また42=42になり、最後は同じになる.
    5.珍しい場合
    (1)ダミー値の等しい比較
    "0" == null;          // false
    "0" == undefined;     // false
    "0" == false;         // true -- 
    "0" == NaN;           // false
    "0" == 0;             // true
    "0" == "";            // false
    false == null;        // false
    false == undefined;   // false
    false == NaN;         // false
    false == 0;           // true -- 
    false == "";          // true --
    false == [];          // true -- 
    false == {};          // false
    "" == null;           // false
    "" == undefined;      // false
    "" == NaN;            // false
    "" == 0;              // true -- 
    "" == [];             // true -- 
    "" == {};             // false
    0 == null;            // false
    0 == undefined;       // false
    0 == NaN;             // false
    0 == [];              // true -- 
    0 == {};              // false
    (2)安全運用暗黙的強制タイプ転換
  • もし両方の値にtrueやfalseがあれば、絶対に使わないでください.
  • 両側の値に[]、“”または0があれば、なるべく使わないでください.
  • この場合は、無意識の強制的な変換を避けるために、==を使用したほうがいいです.この二つの原則はほとんどの強制的な変換ピットを避けることができる.
    五、Object.is(.)は二つの値が等しいかどうかを判断する.
    次の場合はtrueに戻ります.
  • の値はundefined
  • です.
  • の値はいずれもnull
  • です.
  • の値は全部trueですか?それとも全部false
  • です.
  • の値は同じ数の文字からなる文字列
  • である.
  • の値は同じオブジェクト
  • を指す.
  • の値は全部数字で、
  • です.
  • は全部プラスゼロ+0
  • です.
  • は全部マイナス0-0
  • です.
  • はNaN
  • です.
  • は、ゼロとNaN以外の同じ数字
  • である.
    ES 6の前のバージョンについて、Object.is(.)は簡単なpolyfillがあります.
    if (!Object.is) {
        Object.is = function(v1, v2) {
            //      -0
            if (v1 === 0 && v2 === 0) {
                return 1 / v1 === 1 / v2;
            }
            //      NaN 
            if (v1 !== v1) {
                return v2 !== v2;
            }
            //     
            return v1 === v2;
        };
    }
    参考記事:JavaScriptプレミアムプログラム設計あなたが知らないJavaScript(中巻)