value値を文字列に変換する方法及び原理の詳細

4116 ワード

この3つの方法は、valueを文字列に変換することです.1.value.toString()2.「+」+value 3.String(value)
第一の方法はnullとundefinedでtostringメソッドを呼び出すと、第二の方法と第三の方法の効果はほぼ同じです.
  • 「+」+valueという方法は、よく使う人に分かりやすく、便利ですが、読み取り可能性は悪く、コードの維持には不利です.
  • String(value):この方法は読み取り可能性がより良く、唯一の問題は、この関数の呼び出しが人を混乱させる可能性があることである.Stringは構造関数でもあるので、普通の関数としての表現と構造関数としての表現は全く違っています.
  • String('abc') === new String('abc');
    > false
    
    typeof String('abc');
    > 'string'
    
    typeof new String('abc');
    > 'object'
    
    String('abc') instanceof String;
    > false
    
    new String('abc') instanceof String;
    > true
    Stringは、普通の関数として、1つの文字列(元の値)Stringを構成関数として生成する場合、Stringオブジェクトの一例を生成する.
    "+valueとStringのニュアンス
    どちらの方法もエンジン内部のToString()動作を用いて元の値を文字列に変換するものである.この操作関数はECMAScript 5.1で定義されていますが、ES言語自体はアクセスできません.以下の表はToString()が元の値にどう変換されるかを説明しています.
    元の値を文字列に変換
    パラメータ
    結果
    undefined
    「undefined」
    null
    「null」
    ブール値
    「true」または「false」
    数字
    数値を文字列として
    文字列
    変換なし
    オブジェクトを文字列に変換
    これらの2つの方法は、オブジェクト値を最初に元の値に変換し、元の値を文字列に変換します.しかし、このプロセスの中で+は内部のToPrimitive(Number)動作(変換対象がdateオブジェクトでない限り)を使用し、String()はToPrimitive(String)を使用する.
  • ToPrimitive(Number):オブジェクトを元の値に変換し、まずObj.valueOf()を呼び出します.戻り値が元の値であれば、この元の値を返します.そうでなければ、Obj.toStringを呼び出します.戻り値が元の値であれば、元の値を返します.そうでなければ、TypeErr異常を投げます.
  • ToPrimitive(String):上記の方法と同様に、Obj.toString()メソッドを起動するだけです.
  • 判例で見る
    var obj = {
        valueOf:function(){
            console.log('valueOf');
            return {};//     ,    
        },
        toString:function(){
            console.log('toString');
            return {};//     ,    
        }   
    }
    
    //   
    > "" + obj
    valueOf
    toString
    TypeError: Cannot convert object to primitive value 
    
    > String(obj)
    toString
    valueOf
    TypeError: Cannot convert object to primitive value
    結果はいつも同じです.
    上で述べた違いは、実際にはほとんどあり得ないです.大体の対象は標準のvalueOf()方法を使っています.戻り値はいつもこの対象そのものです.
    > var x = {}
    > x.valueoOf() === x
    true
    したがって、ToPrimitive(Number)は、通常、valueOf方法をスキップしてtoStering()方法の戻り値に戻ります.これは、ToPrimitive(String)と全く同じですが、このオブジェクトがBoolean、NumberまたはStringのオブジェクトインスタンスであれば、valueOf()は元の値に戻ります.この2つの操作は、オブジェクトに戻ったvalueOf(ラッピング前の元の値)をToString()で操作した結果、ToPrimitive(String)でオブジェクトのtoString()に戻す方法の戻り値(オブジェクトをラッピングする前の元の値)をString(String)で返します.
    このようにして、彼らはやはり同じ結果を返して、ただ転換の道は異なっています.
    結論
    他の種類の値を文字列に変換する方法はどれですか?この値は永遠にnullまたはundefinedではないことを確認できれば、value.toString()で変換できます.そうでなければ、「+valueとString(value)どちらを選択してもいいです.個人の好みを見て、String(value)がもっと明確だと思います.