ホームページ  >  記事  >  ウェブフロントエンド  >  Javascriptにおける二重等号の暗黙的な変換機構の解析

Javascriptにおける二重等号の暗黙的な変換機構の解析

小云云
小云云オリジナル
2018-01-20 11:26:231246ブラウズ

この記事は主に 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のifとswitch、==と===の違いと接点例の詳細な説明

PHPの==演算子の文字列比較の使用法と副作用の詳細な説明

Oracleデータ型の暗黙的な変換

以上がJavascriptにおける二重等号の暗黙的な変換機構の解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。