「JavaScript」操作数隠蔽タイプ変換

2799 ワード

JavaScriptは非常に許容されるタイプの言語で、コードを作成する過程で、多くのコードが直接に異なるタイプの操作数を操作するのを見ます.時にはコードの作成にとても便利です.チェックしないタイプのほうがコードに隠れていることもあります.デバッグする時、JavaScriptが自動的に実行するタイプの変換についてよく知っていると、問題の所在点が分かりにくいです.
PS:オブジェクト→基本タイプの変換ルールは「JavaScriptアドバンストプログラミングガイド」を参照してください.
一、マイナス、乗号、除号、型取り…
マイナス、乗算、除算、取込みなどの操作は比較的単純な操作です.これらのオペレータは、彼らの操作数を数字に変換する(Number()を使用して)試みます.もし操作数が数字に変換できないなら、彼らの結果はNaNです.NaNは、これらの動作を任意の数で行い、結果はNaNである.
    // Demo1.html
    var obj = {
        valueOf: function() {
            return 18;
        }
    };
    var obj2 = {
        valueOf: function() {
            return 19;
        }
    };

    console.log(
            1 - "2", // -1
            "32" - "22", // 10
            obj % 4, // 2
            obj * obj2, // 342
            "99b" * 10 // NaN
    );
二、大きい、小さい、等しい、小さい
同じ(一)ですが、両方の操作数が文字列の場合&変換できない場合の戻り値は異なります.両方の操作数が文字列である場合、よく知られている文字列比較、すなわち左から右へ順番に各文字のASCIIコードを比較し、オペレータに該当する場合はtrueに戻ります.そうでなければfalseに戻ります.操作数を数字に変換できない場合は常にfalseに戻る.Boolean(NaN) == false
    // Demo2.html
    var obj = {
        valueOf: function() {
            return 18;
        }
    };

    console.log(
            1 <= "2", // true
            "1" <= "a", // true
            obj >= "17" // true
    );
三、=、
この2つの演算子は、ほとんどが(1)と同じで、違いは次の通りです.
  • 文字列op文字列:タイプ変換を行わず、直接比較します.
  • オブジェクトopオブジェクト:参照はすべて同じオブジェクトを指しています.trueです.
  •     // Demo3.html
        var obj = {
            valueOf: function() {
                return 18;
            }
        };
        var obj2 = {
            valueOf: function() {
                return 19;
            }
        };
    
        console.log(
                obj == obj2, // false
                "XD" == "XD", // true
                obj == 18, // true
                obj2 == "19" // true
        );
    暖かいヒント:null == undefined // true四、プラス記号(+)
    特に指定されていない場合は、(一)を参考にします.対象+対象などですが、以下のような例外があります.
  • 文字列+文字列:文字列スティッチング動作を行います.
  • 文字列+その他:他の文字列を文字列に変換してスティッチングを行います.
  •     // Demo4.html
            var obj = {
            toString: function() {
                return "18s";
            },
            valueOf: undefined
        };
        var obj2 = {
            toString: function() {
                return "19b";
            },
            valueOf: function() {
                return 19;
            }
        };
    
        console.log(
                obj + obj2, // "18s19"
                obj2 + obj2 // 38
        );
    注意上記obj + obj2の結果は「18 s 19 b」ではありません.操作数に文字列がないので、(一)の変換規則を参照します.
    DEMO
    【重要なヒント】おすすめとコレクションを忘れないでください.
    git clone https://github.com/JasonKid/fezone.git
    検索操作数の暗黙タイプ変換