私とjavascriptの隠蔽式強制変換を勉強します.

6198 ワード

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

4.足し算の操作手順は敏感です.
このような混合表現は、JavaScriptが動作順序に敏感であるため、困惑することがある.例えば、式:1+2+3; //「33」
加算は左結合(すなわち左結合)からなるので、次の式と同じです. //「33」
これに対して、表式は1+「2」+3です. //「123」の計算結果は文字列「123」です.左結合の法則が一致しているので、式の左側の足し算を括弧に入れます.
5.もう一回見てみます.
1)undefinedイコールnull
2)文字列と数値の比較の場合、文字列は数字に変換されます.
3)数字がブール比較の場合、ブールは数字を回転します.
4)文字列とブールを比較すると、両者は数字を回転します.

// ==
undefined == null; //true
'0' == 0;    //true,      
0 == false; //true,     
'0' == false;    //true,     
null == false;   //false
undefined == false;  //false

7つのfalse値:false、0、-0、“”、NaN、nullおよびundefined、他のすべての値はtruthです.
6、NaNは、数字ではありません.
NaNは特殊な値であり、負の数を求める平方根のようないくつかの算術演算の結果が数字ではないことを示しています.メソッドparseInt()とパー秒eFloat()は、指定された文字列を解析できないときにこの値を返します.通常の場合には、有効な数字の関数を返しますが、この方法を採用して、Number.NaNでそのエラーを説明しても良いです.

Math.sqrt(-2)
Math.log(-1)
0/0
parseFloat('foo')

多くのJavaScriptの初心者にとって、最初の落とし穴はtypeofを呼び出した時に結果を返します.通常は思いがけないことです.

console.log(typeof NaN); // 'Number'
この場合、NaNは数字ではなく、タイプは数字です.分かりますかtypeofが文字列に戻るため、6種類があります.「number」、「string」、「bollan」、「object」、「function」、「undefined」
落ち着いてください.下にはまだ混乱が多いからです.二つのNaNを比較しましょう.

var x = Math.sqrt(-2);
var y = Math.log(-1);
console.log(x == y); // false
もしかしたら、私たちは厳格な等価(==)操作を使っていないからですか?明らかに違います

var x = Math.sqrt(-2);
var y = Math.log(-1);
console.log(x === y); // false
二つのNaNを直接比較しますか?

console.log(NaN === NaN); // false
多くの方法が一つの数字でないことを表しているので、一つの数字以外はもう一つのNaNと同じ数字ではないはずです.
もちろん、解決策はもうあります.グローバル関数isNaNを紹介します.

console.log(isNaN(NaN)); // true

えっと、でもisNaN()は自分の多くの欠陥があります.

console.log(isNaN('hello')); // true
console.log(isNaN(['x'])); // true
console.log(isNaN({})); // true
このようにしてまた多くの異なる解決策が生まれた.一つはNaNの非反射性を利用したものです.

var My = {
 isNaN: function (x) { return x !== x; }
}
幸いなことに、ECMAScript 6にはNumber.isNaN()法が信頼できるNaN値検出を提供しています.言い換えれば、パラメータが本当のNaNの時だけ、trueに戻ります.

console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN(Math.sqrt(-2))); // true
console.log(Number.isNaN('hello')); // false
console.log(Number.isNaN(['x'])); // false
console.log(Number.isNaN({})); // false

二、参照の種類の変換
基本タイプの間の比較は比較的簡単です.引用のタイプと基本のタイプの比較は比較的複雑です.まず引用のタイプを基本のタイプに変えてから上記の方法で比較します.
1.引用タイプのブールは全部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()
  • カスタムのvalueOf()とtostring()はいずれも存在し、デフォルトでvalueOf()を呼び出します.
  • toStering()だけであれば、toStering()を呼び出します.
  • 
    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
    2.明示的な変換
    明示的変換は比較的簡単であり,直接的にクラスを方法として直接変換できる.
    Number([])//0 String([])/」Boolean([])//true
    もっと簡単な変換方法があります.
    3+"////文字列'3'+'3'/数字3!!''3'//true
    以上は本文の全部の内容です.javascriptの暗黙的強制転換を詳しく紹介しました.みなさんの勉強に役に立つように.