JavaScriptの暗黙的な変換

9893 ワード

JavaScriptのデータタイプは、null、undefined、bollan、string、number、objectの6種類に分けられます.objectは引用タイプで、他の5つは基本タイプまたはオリジナルタイプです.私たちはtypeof方法で印刷できます.どのタイプに属しますか?異なるタイプの変数の比較は、先回りタイプと呼ばれ、タイプ変換は陰式変換とも呼ばれます.暗黙的な変換は、演算子の加減乗除において一般的に行われ、等しい、小さい、大きいなどがあります.
typeof '11'  //string       

typeof(11)  //number

'11' < 4     //false
基本タイプの変換
次は加減乗除について説明します.
1.文字列に数字を加えると、数字は文字列に変換されます.
2.数字は文字列を減らし、文字列は数字に変換します.文字列が純粋な数字でないとNaNになります.文字列のマイナス数も同じです.二つの文字列が減算されても、先に数字に変換されます.
3.乗、除、大、小と減の転換も同じです.
//     + - * == / 

// + 

10 + '20'    //'2010'

// -

10 - '20'    //-10

10 - 'one'   //NaN

10 - '100a'  //NaN

// *

10*'20'      //200

'10'*'20'    //200

// /

20/'10'      //2

'20'/'10'    //2

'20'/'one'  //NaN
 もう一つのセットを見てください.
1.undefinedイコールnull
2.文字列と数字の比較の場合、文字列は数字に変換されます.
3.数字がブール比較の場合、ブールは数字を回転します.
4.文字列とブールを比較すると、両者は数字を回転します.
// ==

undefined == null;    //true

'0' == 0;            //true,      

0 == false;           //true,     

'0' == false;       //true,     

null == false;       //false

undefined == false;  //false
 
参照の種類の変換
基本タイプの間の比較は比較的簡単です.引用のタイプと基本のタイプの比較は比較的複雑です.まず引用のタイプを基本のタイプに変えてから上記の方法で比較します.参照タイプのブールはすべてtrueです.たとえば空の配列は、対象が参照タイプである限り、trueとなります.参照の種類から数字または文字列を切り替えるには、valueOf()またはtoString()を使います.オブジェクト自体はvaluOf()とtoString()を継承しており、valueOf()とtoString()をカスタマイズすることもできます.各オブジェクトによって継承されたvalueOf()を文字列に変換し、数字またはそのものを対象としてtoStringを用いて文字列に変換します.一般的なオブジェクトは、デフォルトでvalueOf()を呼び出します.
1.対象が数字を変換する場合は、valueOf()を呼び出します.
2.オブジェクトが文字列に変換される場合、toString()を呼び出します.
まず次の例を見てください.
0 == [];        // true, 0 == [].valueOf(); -> 0 == 0;

'0' == [];      // false, '0' == [].toString(); -> '0' == '';

2 == ['2'];     // true, 2 == ['2'].valueOf(); -> 2 == '2' -> 2 == 2;

'2' == [2];     // true, '2' == [2].toString(); -> '2' =='2';



[] == ![];      //true, [].valueOf() == !Boolean([]) -> 0 == false -> 0 == 0;
オブジェクトが数字に変換された場合、valueOf()を呼び出し、その前に呼び出したのはtoString();ですから、valueOfの方法はこうだと思います.So上の例は0=[]を以下のように変更します.いずれにしても、[]は最後に0になる.
var valueOf = function (){

    var str = this.toString();    //   toString(),     

    //...

}

0 == [];        // true, 0 == [].valueOf(); -> 0 == '0' -> 0 == 0;
カスタムvalueOf()とtostring()
1.カスタムvalueOf()とtoStering()が存在し、デフォルトでvalueOf()を呼び出す.
2.toString()だけであれば、toString()を呼び出します.
var a = [1];



a.valueOf = function (){ return 1;}

a.toString = function (){ return '1';}



a + 1;         // 2, valueOf()   
valueOfを除くとtoString()が呼び出されます.
var a = [1];



a.valueOf = function (){ return 1;}

a.toString = function (){ return '1';}



a + 1;         // 2,    valueOf()

//  valueOf

delete a.valueOf;

a + 1;        // '11',   toString()
他に戻ったらどうなりますか?
var a = [1];



a.valueOf = function (){return ;}

a.toString = function (){return 1 ;};



1 - a;        //NaN
他のオブジェクトがvalueOf()を呼び出して、異なるタイプに変わります.
var a = {};

a.valueOf();    //Object {}

var a = [];

a.valueOf();    //[]        

var a = new Date();

a.valueOf();    //1423812036234    

var a = new RegExp();

a.valueOf();    //    /(?:)/      
 
引用タイプの間の比較はメモリアドレスの比較であり、暗黙的な変換は不要であり、ここでは多く言わない.
[] == []  //false      



var a = [];

b = a;

b == a   //true
 
明示的な変換 
明示的変換は比較的簡単であり,直接的にクラスを方法として直接変換できる.
Number([]);        //0

String([]);        //''

Boolean([]);       //true
もっと簡単な変換方法があります.
3 + ''    //    '3'

+'3'      //   3

!!'3'     // true
 
参考資料:
<JavaScript権威ガイド第六版>第三章
http://www.cnblogs.com/snandy/archive/2011/03/18/1987940.html
http://www.2cto.com/kf/201304/204383.html
http://1.liangtao.sinaapp.com/?p=555