JavaScriptの強制タイプ変換

7366 ワード

強制変換
javascriptの値を1つのタイプから別のタイプの値に変換します.タイプ変換は暗黙のタイプに変換されます.Toprinmitiveは元の値を回転するので、javascript内部で使用される「抽象的な操作」です.
ToString
一般的なオブジェクトに対しては、toString()メソッドを指定しない限り、toStringメソッドは内部属性[[クラス]]、[Object.prototype.toString()]を返します.配列のデフォルトのtoString()メソッドは再定義されています.
var a = [1,2,3];
a.toString();   //"1,2,3"
JSON.stringify()プロローグ
すべての安全なJSON値はJSON.stingifyを使って文字列化できます.安全でないJSONの値は、undefined、function、smbolです.
JSON.stringify(undefined)    //undefined
JSON.stringify(function(){})    //undefined
JSON.stringify(Symbol())    //undefined
JSON.stringify([1,undefined,function(){},4])   //"[1,null,null,4]"
実はJSON.strigifyはオブジェクトをプログレッシブする時に呼び出されるのはオブジェクトtoJSONメソッドが返すオブジェクトです.toJSONは文字列化できる安全なJSON値を返します.JSON.strigify(obj,replacer,space);replacerは、オブジェクトのプログレッシブ中のデータフィルタリングを指定する関数または配列であり、toJSONと同様である.スペースはインデントです.
ToNumber
true->1、false->0、undefined->NaN、null->0のオブジェクト(配列を含む)は数字を回転して、まず対応する基本的なタイプの値に変換します.抽象的な操作ToPrimitiveはこの値がvalueOfかどうかを検査します.もしない場合はtostring()の方法で強制的なタイプ変換を行います.両方法はありません.原型のない統合されたオブジェクトを作成します.強制的なタイプ変換はできません.」
JSON.stringify(Object.create(null))      //"{}"
Number(Object.create(null))   //  :Cannot convert object to primitive value
String(Object.create(null))  //  :Cannot convert object to primitive value
Boolean(Object.create(null))  //true(  {}        )
でもちゃんと顔を叩いた!!ブラウザが専門的な境界処理をしたのではないですか?
ToBoolean
Javascriptにおける偽の値:undefined、null、false、+0、-0とNaN、空の文字列「」があります.偽の値の強制変換タイプはfalseであり、偽の値のリストの意味以外の値は全て真の値である(もちろん、偽の値のパッケージオブジェクトも含む).
var a = new Boolean(false);
var b = new Boolean(0);
var c = new Boolean('');
var d = Boolean(a && b && c)   ///true
すべての文字列は真の値です.'空の文字列以外は、偽の値リストで唯一の文字列です.
var a = [];
var b = {};
var c = function(){};
var d = Boolean(a && b && c);  //d
「-」、{}、function(){}は全部偽のリストにないので、全部本当の値です.
ToPrimitive(data,preferedType)【元の値に変換】
1.dataが元の値であれば、直接に2を返します.対象であれば、valueOfを呼び出して元の値3を返します.そうでなければ、data.toStringを呼び出して元の値4を返します.そうでなければ、エラーが発生します.
String()とnew String()、Number()とnew Number()
String()変換はToStingの規則に従い、NumberはToNumber規則に従う.文字列の変換は、toString()方法を直接使用することもできる.numberの変換は1元の形式を使用することができます.
var c = "3.14";
var d = 5+ +c;
 d      //8.14
1 + - + + + - + 1;  //2(+         ,-         ,      -)
一元演算子のよくある装13の使い方:
// Date          ,      
var d = new Date();
+d;   //1552902330544
var timestamp = +new Date();
//   ,       (                )
var timestamp = + new Date;
現在の時間を取得する方法は他にもあります.
var timestamp = new Date().getTime();  //    
var timestamp = Date.now();   //ES5   
もう一つの~演算子(ビット別)があります.つまり、バイナリのビット別非演算です.2の補数を返します.x=>-(x+1)を10進数で指定します.
var a = 'Hello World';
~a.indexOf('lo');   //-4   ==>  
~a.indexOf('ol');   //0  ===>  
文字列が存在するかどうかを判断します.~indexOf()を使って判断します.!!
解析数字文字列
Number()とParseInt()は、前者が変換であり、後者が解析である.変換【非数値文字列を含むことは許されません】と解析【非数値文字列を含むことができます】は相互に代替関係ではありません.
var a = "32";
var b = "32px";
Number(a)  //32
Number(b)  //NaN
parseInt(a)  //32
parseInt(b)  //32
非文字列を解析
parseInt(1/0,19);   //18
//   
parseInt("Infinity",19);   //18
parseInt(new String(42))   //42
ブール値に変換されたBooleanを表示します()
単項演算子値を強制的にブール値に変換することが表示されますので、ブール値に変換して表示します.もちろんBoolean()構造関数も使用できます.
暗黙的強制タイプの変換
JavaScriptの設計上の欠陥と言われていますが、その役割は冗長性を減らし、コードをより簡潔にします.
var a = [1,2];
var b = [3,4]
a + b;   //"1,23,4"   "1,2"+"3,4" = "1,23,4"
aとbは先に文字列に変換してスティッチングします.+操作が文字列の場合、文字列スティッチングを行います.そうでなければ、数値加算を行います.
[] + {}  //"[object Object]"
'' + {}  //"[object Object]"
{} + []  //0
String([]//“”;String({}/「[object]」;Number([]//0で{}+[]//{}はコードブロックとして扱われ、jsオブジェクトではなく、[]はnumberに変換され、0の結果が得られます.
暗黙的な変換作用
  • は、数字を文字列
  • に変換する.
    var a = 42;
    var b = a + ""; //"42"
    
  • 文字列は、強制的にデジタルタイプ
  • に変換されます.
    var a = "3.14";
    var b = a - 0; //3.14
    
    は、数字演算子です.同様にa*1、a/1などもあり、文字列を数字の種類に変換します.
    var a = [3];
    var b = [1];
    a - b; //2 
    
    上は、まず2つの配列に対して文字列処理a='3',b='1'を行い、その後文字列を-を使う場合、数字変換演算を行います.3-1=2ですb=String(a)/強制表示変換b=a+「」//暗黙タイプ変換下の判定関数の複数のパラメータがある場合、一つのパラメータだけが本当の場合はtrueに戻ります.
    function onlyOne(){
       var sum = 0;
        for(var i = 0;i
    !argments[i]//パラメータをtrueまたはfalseに変換します.
  • 暗黙的にブール値(1)if(.)文の条件判定式に変換します.(2)for(.;;.)ステートメントの条件判定式(2番目).(3)while(.)とdo.while(.)のループにおける条件判定式.(4)で条件判定式を行います.(5)論理演算子(※)と&&(論理和)の左側の演算数(条件判定式として)条件判定における判定式.ToBooleanルールに従います.
  • 𞓜𞓜と&彼らの戻り値は2つの動作数のうちの一つです.
  • var a = 32;
    var b = 'abc';
    var c = null;
    a || b;   // 32
    a && b;  // "abc"
    c || b    //"abc"
    c && b  //null
    
    最初の数はtrueであり、条件判断であり、最初の数はfalseであり、そうでなければ第二の数に戻る.彼らを「オペランドセレクタ」と呼ぶことができます.
    a || b   ===  a ? a : b
    a && b === a ? b : a
    
    &の効用
    function foo(){
      console.log(a)
    }
    var a = 42;
    //    
    a && foo();  
    //      
    if(a){
      foo();
    }
    
  • シンボルの強制タイプ変換
  • var s1 = Symbol('cool');
    String(s1)    //"Symbol(cool)"
    var s2 = Symbol("not cool");
    s2 + "";   //TypeError
    !!s1      //true
    
    記号は強制的に数字に変換できませんが、強制的にブール値に変換できます.結果はすべてtrueです.
    ゆとりイコール=厳格とイコール
    解释一:“==検査値が等しいかどうか、==検査値とタイプが同じかどうか.このような説明はまだ正確ではない!”タイプが異なる場合は、強制的なタイプ変換が必要です.JavaScriptエンジンはタイプに対する変換時間はマイクロ秒で、性能を気にしなくてもいいです.だから:==と==はいずれもデータの種類を検査して、違いはデータのタイプの処理の方式を操作するのが異なっています.比較対象が等しい場合、==と==は同じです.
    var a = 42;
    var b = "42";
    a === b //false
    a == b //true,b     number      
    
    var a = "42";
    var b = true;
     a  == b;  //false  ===> 42 == 1
    
    ブール型の緩みがあるか、それとも強制的に数字に変換して比較します.どんな状況でも使わないでください.==trueと==falseで、しかも=ゆったりとしている中で、nullとundefinedは同じです.null==undefined//trueオブジェクトと非オブジェクトとの間の==比較は、オブジェクトToPromitiveを「まず対象のvalueOfを呼び出し、そのデフォルトは対象自体が「顔を覆う」か、ない場合は対象のtostring()を呼び出して比較します.
    var a = 42;
    var b = [ 42 ];
    a == b;    // true
    
    ゆったりと等しい=>nullとundefinedがゆったりしているのは同じです.つまり、他のどの値とも同じです.ブール値は他のタイプと比較し、ブールは先に数字に変換して比較します.文字列と数字の比較は、統一的に数字に変換して比較します.オブジェクトとオブジェクト以外のオブジェクトとの間の緩やかな等しい比較は、オブジェクトtoPrimitive後に得られる基本的なタイプを比較します.
    //       ,         , valueOf          
    var a = new String('123');
    a == '123';  //true
    
    ちょっと変わった状況を見てください.
    if(a == 2 && a == 3){
    //...
    }
    var i = 2;
    Number.prototype.valueOf = function(){
     i++;
    }
    var a = new Number(12);
    if(a == 2 && a == 3){
      console.log("Yep, this happened.")
    }
    //Yep, this happened.
    
    よくない偽の値の比較:
    "0" == false; // true --->  0 == 0
    false == 0   //true ===> 0 == 0
    false == ""  //true  ===> false == false
    //  Number("") ---> 0,Number(false) ---> 0,Number([])---> 0,  
    "" == 0   //true
    "" == []  //true
    false == 0  //true
    false == "" // true
    false == []  //true
    0 == []  //true
    //      
    [] == ![]  //true    ![]  false。[] == false true