JSでの強制変換ルール

序文

JavaScriptの基本タイプとオブジェクトタイプを含む7つの組み込みデータ型がありますが、

 

基本タイプ

基本的なタイプは、以下の6つに分類されます。

  • 文字列(文字列)

  • ブール(ブール値)

  • 数(デジタル)

  • 記号(シンボル)

  • ヌル(空値)

  • 未定義(未定義)

  1. 文字列、数値、ブール値、およびnullは、彼らは基本的なタイプのダウン細分化することができないことを総称してプリミティブ型(プリミティブ)と呼ばれる5つのタイプを、未定義

  2. シンボルES6新しいデータ型である、によりプリミティブ型値シンボルの形成に、シンボル関数呼び出しによって生成された一意のシンボル値を表す、新しい関数がコールシンボルを使用することはできません

  3. ヌルとすることは、一般的にユニークなこれらの2つのタイプの値は、それ自身で、特別な値であると考えられて未定義

 

オブジェクトの種類

また、参照型、配列及び関数として知られているオブジェクトの種類は、オブジェクトのサブタイプです。プロパティの論理的順序なしコレクションオブジェクト、コンテナの様々な値が位置しています。オブジェクトは、オブジェクトの値が可変であるように、異なる基本タイプと値不変特性ことを、アドレスに記憶された基準値であります

 

 

JSでの強制変換ルール

(元の値に)たToPrimitive

たToPrimitive変換プロセスは、非オブジェクトタイプに参照型のオブジェクト(物体)であり、参照型(オブジェクト)、元の型のため、元の種類に発生していません

たToPrimitive演算子は値、及び所望のタイプのオプションのパラメータを受け入れます。オブジェクトはプリミティブの複数の型に変換する能力を有する場合、所望のタイプがタイプすることを代替を提案するために使用することができ、非オブジェクト型の値を変換するたToPrimitiveオペレータ

元の型を変換した結果は、それが我々が通過することである事実の所望のタイプを入力し、所望のタイプによって決定されます。直接はより明確に以下を参照してください。たToPrimitive方法おそらく長いように、Aの方法は次のよう

/ ** 
*オブジェクトを変換する@objニーズ
* @type生データは、所望のオプションに変換される
* / 
れたToPrimitive(OBJ、タイプ)

 

タイプの異なる値を示して

    • タイプは文字列です

      1. 最初の元の値は、その後戻す場合、OBJのtoStringメソッドを呼び出し、そうでなければステップ2

      2. コールOBJのvalueOfメソッド元の値ならば、次に戻り、そうでない場合はステップ3

      3. TypeError例外がスローされます

    • 番号の種類

      1. 元の値が返された場合OBJの呼び出しvalueOfメソッド、そうでなければステップ2下

      2. 元の値場合toStringメソッドは、そうでなければステップ、戻りその後、OBJコール3

      3. TypeError例外がスローされます

    • typeパラメータがnullの場合

      1. オブジェクトが日付で、タイプがStringに設定されています

      2. それ以外の場合は、タイプが数値に設定されています

 

Dateデータ型固有の命令

日付データ型は、我々は番号が、それは、文字列がより明確に使用して、ミリ秒に対応する値を取るならば、むしろミリ秒(タイムスタンプ)よりも、その時刻に変換され、より文字列の期待しています。他の種類のオブジェクトの値に対する操作の種類に応じて

 

たToPrimitive概要 

 たToPrimitiveは数として実際の状況に応じて指定されていない場合、デフォルトの二つの条件は、文字列の日付、残りのオブジェクト、オプションのパラメータを入力し、タイプに応じて、元の形に変換、指定された場合、指定された型変換。それはタイプの種類を指定するときに、それは2つの変換を次のように依存します

 

 

Object.prototype.toString()

toString()メソッドは、オブジェクトを表す文字列を返します

各オブジェクトは、目標値をテキスト文字列として表現されるか、または所望の基準オブジェクトと、メソッドが自動的に呼び出され、toString()メソッドを有します

ここで覚えておく、のvalueOf()メソッドとtoString()は、特定の状況で自分自身を呼び出します。

 

 

Object.prototype.valueOf()メソッドは、指定されたオブジェクトの元の値を返します

JavaScriptのコールのvalueOf()メソッドは(数値、文字列、ブール)プリミティブ型の値にオブジェクトを変換するために使用されます。しかし、我々はほとんどこの機能を自分で呼び出す必要はありません、valueOfメソッドは、通常はJavaScriptを自動的に起動されます

valueOfの異なるは、組み込みオブジェクトを達成するために

  • =>戻り値文字列の文字列値

  • 番号=>は数値を返します

  • 日付=>は、文字列の内容は、特定の実装に依存して、すなわち、時間値、数値を返します

  • ブール=>このブールの戻り値

  • オブジェクト=>これを返します

コードの制御

CONST STR = NEWSTRING( '123')。
console.log(str.valueOf()); // 123 
CONST NUM = newNumber(123)。
console.log(num.valueOf()); // 123 
CONST日= NEWDATE()。
console.log(date.valueOf())。// 1526990889729 
CONST BOOL = newBool​​ean( '123')。
console.log(bool.valueOf()); //真
CONST OBJ =でnewObject({のvalueOf:()=> { 
    return1 
}})
はconsole.log(obj.valueOf()); // 1

 

 

数値演算子の変換ルール

  • nullは0に変換しました

  • 未定義のはNaNに変換され、

  • 本当であるにはfalseを0に変換し、1に変換しました

  • 数値定数の規則に従うように文字列を変換し、変換はNaNを返す失敗しました

ここで、オブジェクトが最初の数として指定され、たToPrimitive変換を返し続けタイプたToPrimitive変換を呼び出し、元の値に変換しなければならない(たToPrimitive参照)

 

 

ストリング

文字列演算子の変換ルール

  • nullは「null」に変換されます

  • 変換不定不定

  • 改宗真の「真」、偽のが「偽」に変換

  • 一般的な規則に従うようにデジタル・コンバータ、使用指数マクシミンデジタル形式

ここでの目的は、最初の文字列として指定を入力したToPrimitive変換を呼び出し、元の値に変換し、そしてたToPrimitive変換を返すために継続しなければならない(たToPrimitive参照)

文字列(NULL)// 'ヌル' 
文字列(不定)// '未定義' 
の文字列(TRUE)// '真' 
の文字列(1)// '1' 
の文字列(-1)// '-1' 
の文字列(0 )// '0' 
文字列(-0)// '0' 
文字列(Math.pow(1000,10))// '1E + 30' 
の文字列(無限)// '無限' 
の文字列(-Infinity)// '-Infinity' 
文字列({})// '[対象オブジェクト]' 
の文字列([1、[2,3]])// '1,2,3' 
文字列([ 'コアラ'、1])//コアラ、1 
ブール(未定義)// falseの
ブール値(NULL)//偽
ブール(0)//偽
ブール(NaNの)//偽 
ブール( '')//偽
ブール({})//真の
ブール値([])//真
のブール(newBool​​ean(偽))//真

 

 

ブーリアン

演算子変換規則ToBoolean

6以下の変換結果値に加えて、他のすべての真偽であります

  1. 未定義

  2. ヌル

  3. -0

  4. 0または0

  5. NaNの

  6. 「」(空文字列)

Falseの値は真の値以外の値です。これは、(空のオブジェクトを含む)すべてのオブジェクトの変換結果が真である、新しいブール(偽)に対応しても偽Booleanオブジェクトがtrueを含み

ブール(未定義)//偽の
ブール値(NULL)//偽
のブール(0)//偽
のブール(NaNで)//偽
のブール( '')//偽
のブール({})//真の
ブール値([])/ /真
ブール(newBool​​ean(偽))//真

 

 

JS変換規則は、異なるシナリオに適用されます

何時間が自動的に文字列型に変換されます

ノーオブジェクトの前提の下で

文字列を追加すると、自動文字列変換は、主に発生します。文字列値は、他の値は、文字列、文字列後者にないとき

'2' + 1 // '21' 
'2' +真// "2true" 
'2' +偽// "2false" 
'2' +未定義// "2undefined" 
'2' +ヌル// "2null"

オブジェクトがある場合、そしてときにオブジェクト+

//のtoStringオブジェクト
VAR OBJ2 = { 
    のtoString:関数(){ 
        return'a ' 
    } 
} 
はconsole.log(' 2「+ OBJ2)
//出力2A。
//一般物体
VAR OBJ1 = { 
   A :. 1、
   B :2 
} 
はconsole.log( '2' + OBJ1); 
//出力2 [オブジェクトのオブジェクト] 
//いくつかの特別なオブジェクト
'2' + {} // "2 [オブジェクトオブジェクト" 
'2' + [ ] // "2" 
'2' +関数(){} // "2function(){}" 
'2' + [ 'コアラ' ,. 1] // 2koala ,. 1

次のように「2」+ OBJ2が詳細に示され、上記の

  1. 文字列の左には、変換後、元の値を変更しないたToPrimitive

  2. また、右への変換変換の元の値たToPrimitiveに記載の指定されたタイプは、Number、変換たToPrimitive obj2.valueof()、元の値が得られない、第三の工程の呼び出しであるため

  3. コールのtoString()の戻り「」

  4. 記号列は両側に存在するが、+演算子は文字列規則は文字列型スプライシングに変換され使用します

  5. 出力2A

次のように「2」+ OBJ1が詳細に示され、上記の

  1. 元の値に文字列、たToPrimitive放置した後に変更されません。

  2. また、右への変換変換の元の値たToPrimitiveに記載の指定されたタイプは、Number、変換たToPrimitive obj2.valueof()、{与えるための呼び出しであるため:1、B:2

  3. コールのtoString()の戻り[オブジェクトのオブジェクト]

  4. 記号列は両側に存在するが、+演算子は文字列規則は文字列型スプライシングに変換され使用します

  5. 出力2 [オブジェクトのオブジェクト]

いくつかの特別な変換ルールオブジェクトコードは、それらを設定していない、基本的に同じである、あなたはプロセスを考えることができます

オブジェクトがオブジェクトであるか否か、たToPrimitive変換で元の値を変換する処理があるが、元の型変換を変更しない、オブジェクトタイプ固有の変換が発生します

  

文字列型変換の開発プロセス、多くの場合、間違ったポイント

VAR OBJ = { 
  幅: '100' 
}; 
obj.width + 20 // "10020"

実際の出力結果120 10020出力予想

 

 

自動的に数値型に変換するとき

  • そこ加算演算子が、文字列型なしで、タイプは、優先的に数値に変換されます

    真// 1 + 0 
    2 //真+真
    真+の偽// 1
  • 加算演算子に加えて、他のオペレータは、自動的に数値計算に変換され

    '5' - '2' 3 //。
    * '2' // 10'から5' 
    trueに- // 0.1 
    。falseに- // -1 1 
    '1' - 1 // 0 
    * [] // 0' 5' 
    偽/へ// 0 'から5' 
    'ABC' - NaN 3を1 //。
    ヌル+ 1. 1 //。
    未定義+ NaN 3を1 //。
    //単項(ノート・ポイント)
    + 'ABC' // NaN 3を
    -'abc' / / NaN 3を
    trueに+。1 // 
    -false // 0
    

    ヌル値に変換するとき未定義スイッチのNaNの値が、0であります

     

 

 

等号を分析することも、特別な命令数の内部に配置されています

要約は異なる優先文字列が長くなるが、Nuber優先+ ==比較演算子に等しいです。Xの例== yが下記

  • X場合、yは数、解釈のない直接比較され

    //偽1 == 2
  • オブジェクトが存在する場合、たToPrimitive()型が数値に変換、その後の比較

    OBJ1 = {VAR 
        のvalueOf:関数(){ 
            return'1 ' 
        } 
    } 
    真// 1 == OBJ1 
    obj1.valueOfを(呼び出し元の値に// OBJ1)
    //戻りの元の値' 1 ' 
    //' 1 'をTONUMBER == 1は、与えることを比較して1 
    [] ==![]に真// 
    // []ターゲットを得たToPrimitive ' 
    //![]変換されたブール0として
    //'「== 0 
    //変換0 == 0 //真
  • ブールでは、ブールはToNumberに応じて1または0に変換され、その後比較

    //ブール第1上記のルールに従って得られた、数に変換
    falseに// == 1. 3 
    // 0 == 0 trueに
    。3 // trueとfalseに== 
    '0' == // falseにtrueに
  • xは文字列である場合、yは数であり、数Xをオンに比べ

    // '0' TONUMBER()0与えるために
    trueに// 0 == 0を
    '0' // == 0 trueに
    

     

 

ときブール変換

  • ブール比較

  • (OBJ)場合、時間(OBJ)が決定される等のみ三オペレータブールを含むことができるが

条件部に各値の対応は、使用後に否定演算子は、それが真偽となるされています

IF(未定義!
  &&ヌル!
  && 0!
  &&のNaN 3!
  && '!' 
{)
  はconsole.log( '真の'); 
} // trueに
2例を以下//ブール型に転送することができる
発現真:偽?
!!表現

 

 

NaNに関連する要約

NaNの概念

NaNのオブジェクトのグローバルプロパティでは、NaNは、オブジェクトのグローバルプロパティで、NaNは特殊なタイプの数値であります

NaNを返した場合(第2の開口質問が解決されました)

  • インフィニティ無限大で割った値

  • 任意の負の平方根を行うには

  • 番号と一緒に、または未使用算術演算子は、デジタルオペランドに変換することができません

  • デジタルに文字列を解析

いくつかの例

無限/無限大、無限で除算//無限
Math.sqrt(-1); //任意の負のための平方根を作る
「」 - 1; //算術演算子は一緒に番号を持つかどうかデジタルオペランドに変換することができません使用
。* 'A'を1、
'A' / 1; 
のparseInt( 'A'); //デジタルに文字列を解析
parseFloatは( 'A'); 
数( 'A'); //のNaN 3 
'ABC' - 1。 NaN 3を// 
未定義+ NaN 3を。1 // 
//単項(ノート・ポイント)
+ 'ABC' // NaN 3を
-'abc「// NaN 3を

 

 

誤解

文字列のtoStringとの違い

 

  • toString()データが文字列に変換することができるが、ヌルを変換することができず、不定

    コンソール。ログ(。ヌルのtoString())
    //报错はTypeError:ヌルのプロパティ'のtoString'読み取ることができませんコンソールを。ログ(未定義。のtoString())//报错はTypeError:プロパティを読み取ることができません'のtoString'未定義の


  • ストリング

    文字列()は、文字列nullに変換され、未定義が、16進数の文字列を回すことができないことができます

    コンソール。ログ(文字列(ヌル)); 
    //ヌル
    コンソール。ログ(文字列(未定義));
    //未定義
  • toString()は16進数に代わって、括弧内の数字を書くことができ

    • バイナリ:.toString(2)

    • オクタル・:.toString(8)

    • 小数:.toString(10)

    • 六角:.toString(16)

 

おすすめ

転載: www.cnblogs.com/zhazhanitian/p/12599252.html