この記事は主に JavaScript における二重等号 (==) の暗黙的な変換メカニズムを詳しく紹介します。これは非常に優れており、必要な方は参考にしていただければ幸いです。
JavaScript で等価関係を判断するには、2 つの等号 (==) と 3 つの等号 (===) の 2 つの方法があります。 2 つの等号 (==) は値の等しいことを示し、3 つの等号 (===) は厳密な等しい (値と型が完全に等しいかどうか) を示します。
そこで、いくつかの常識的な知識があります:
1. 文字列や数値などの基本的な型の場合、== と === には違いがあります
1) 異なる型間の比較、「== に変換した後」同じ型の「値」を比較して、「値」が等しいかどうかを確認します。 ===型が異なると、結果は等しくなくなります
2) 同じ型を比較し、「値」を直接比較すると、結果は次のようになります同じです
2. 配列、オブジェクトなどの場合、高度な型の場合、==と===に違いはありません
「ポインタアドレス」を比較します
3. 基本型と高度な型では違いがあります。 ==と===の間
1) ==の場合、基本型への高度な変換、「値」の比較
2) 型が違うので、===の結果は偽になります
つまり、double等号 (==) は演算中に型変換を実行し、3 番目の等号は演算中に型変換を実行します。いいえ (===) は実行しません。
例:
alert('55' == 55); //true alert('55' === 55); //false
Javascript 言語の 5 つの基本データ型 (プリミティブ値、単純なデータ型とも呼ばれる): 未定義、Null、ブール、数値、文字列。これらのプリミティブ型は固定量のスペースを占有するため、より小さなメモリ領域、つまりスタックに格納できます。このようなストレージにより、変数の値の迅速な検索が容易になります。
JavaScript で二重等号 (==) を使用して、両側が単純型の場合:
1、1,1 の暗黙の変換メカニズムを決定します。 、両側が単純な型であり、型が同じであるため、直接比較します。
console.log(1==1); //true console.log("1"=="1"); //true console.log(false==false); //true console.log(null==null); //true console.log(undefined==undefined); //true
1.2. 両側が単純型である場合、型が異なる場合は、最初に数値比較に変換されます (ブール値は true==1、false==0 の 2 つの値のみ、null と unknown は等しい、文字列の数値)。空の文字列 ""==0;)
console.log(1==true); //true console.log(0==false); //true console.log(1=="1"); //true console.log(0==""); //true console.log(0==null); //false console.log(0==undefined); //false console.log(null==undefined); //true
2. 一方が単純型で、もう一方が参照型 (高度な型) の場合、高度な型は暗黙的に単純型に変換されます。比較する前に。
console.log(Object==Object); //true console.log(Object=={}); //false console.log(0=={}); //false console.log(0==[]); //true console.log(Array==Array); //true console.log(Object==Array); //false
3. 両側が参照型(高度な型)の場合、「ポインタアドレス」の比較が実行されます。
重要な点 - toString() と valueOf()
これら 2 つのメソッドを見たときに多くの人が抱く第一印象は、toString() メソッドはオブジェクトを文字列に変換し、valueOf メソッドはオブジェクトを数値に変換するということです。 。
この考えは非常に一方的です。次の 2 つの例を見てみましょう:
var obj={ name:"熊仔其人", getName:function(){ return $(this).name; } }; console.log(obj.toString()); //[object Object]
obj オブジェクトを定義し、その toString メソッドを呼び出します。戻り値は [object Object] ですが、値が返されないことを確認します。私たちが想像したように、その内容の文字列表現。
var arr=[1,2,3]; console.log(arr.valueOf()); //(3) [1, 2, 3]
配列 arr を定義し、その valueOf メソッドを呼び出します。戻り値は [1, 2, 3] ですが、想像したような数値表現が返されないことがわかります。
実際、本当の理解は次のとおりです。オブジェクトの toString() メソッドを呼び出すと、オブジェクトを文字列に変換できますが、文字列に変換したい場合は、必ずしも toString メソッドを呼び出す必要はありません。
以下のコードをもう一度見てみましょう。
var obj= { }; obj.valueOf=function(){ return 1; } obj.toString=function(){ return 2; } console.log(obj==1); //true var obj2= { }; obj2.valueOf=function(){ return 2; } obj2.toString=function(){ return 1; } console.log(obj2==1); //false var obj3={ }; obj3.valueOf=function(){ return []; } obj3.toString=function(){ return 1; } console.log(obj3==1); //true
上記のコードでは、オブジェクトobj、obj2を定義し、valueOfメソッドとtoStringメソッドの戻り値を定義し、それらが等しいかどうかを1と比較すると、valueOfメソッドが最初に呼び出されることがわかりました。
次にオブジェクトobj3を定義し、valueOfメソッドとtoStringメソッドの戻り値を定義し、1と等しいかどうかを比較すると、toStringメソッドを呼び出していることがわかります。
次に、次のコードを見てみましょう:
var obj= { }; obj.valueOf=function(){ return 'a'; } obj.toString=function(){ return 2; } console.log(obj=='a'); //true var obj2= { }; obj2.valueOf=function(){ return 'b'; } obj2.toString=function(){ return 'a'; } console.log(obj2=='a'); //false
オブジェクト obj は、上記のコード 2 で定義されています。それを文字列 'a' と比較することで、valueOf メソッドを呼び出していることがわかります。
すると、オブジェクト obj2 と 'a' の比較は false を返し、toString メソッドが呼び出されないことがわかります。
これから結論を導き出すことができます:
オブジェクトが単純な型に変換されると、最初に valueOf メソッドが呼び出され、単純な値と比較できる場合は直接比較され、次に toString メソッドが呼び出されます。現時点では呼び出されなくなります。 valueOf メソッドを呼び出した後、valueOf メソッドを単純な値と比較できない場合は、最終的に比較結果を取得するために toString メソッドが再度呼び出されます。
ただし、Date オブジェクトは上記のルールを満たしていないことに注意してください。Date オブジェクトの toString メソッドと valueOf メソッドは再定義されており、デフォルトで toString メソッドが呼び出されます。
追記: js の二重等号の暗黙的な変換ルール
比較に二重等号を使用する場合、2 つのオペランドの型が異なる場合、二重等号は暗黙的な変換を実行し、比較する前に同じ型に変換します。以下は、Little Red Book の P51 ページに記載されている変換規則です。 (私はいつも忘れてしまいますが、記憶力の良さは文章の悪さほどではないと今でも感じています。書くことは常に大きな影響を与えます)
1. 1 つのオペランドはブール値です。ブール値を数値に変換して比較します。 . false は 0、true は 1.
2。1 つは文字列で、もう 1 つは数値です。文字列を数値に変換し、比較します。
3. 1 つの演算子はオブジェクトであり、もう 1 つはオブジェクトではありません。まず、valueOf() を使用してオブジェクトの値の型を取得し、その後、他のルールに従って比較します。
関連する推奨事項:
以上がJavascriptにおける二重等号の暗黙的な変換機構の解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。