ホームページ >ウェブフロントエンド >jsチュートリアル >Javascriptにおける二重等号の暗黙的な変換機構の例
それでは、いくつかの常識的な知識があります:
1. string、number、== と === などの基本的な型の場合、== と === は異なります
1) 異なる型間の比較、== 比較は「型の後に同じ「値」を付けて「値」が等しいかどうかを確認します === 型が異なる場合、結果は不等になります
2) 同じ型の比較の場合は、「値」と結果を直接比較します。同じになります
2. 配列、オブジェクトの場合 高度な型の場合、==と===に違いはありません
「ポインタアドレス」を比較します
3. 基本型と高度な型には違いがあります。と ===
1) == については、高度な型を比較する 基本型に変換して「値」の比較を行う
2) 型が異なるため、=== の結果は false になります
つまり、 二重等号 (==) は操作中に 型変換 を実行しますが、三重等号 (===) は実行しません。
例:
alert('55' == 55); //true alert('55' === 55); //false
JavaScript言語の5つの基本的なデータ型(プリミティブ値、単純なデータ型とも呼ばれる):すなわち、未定義型、Null型、ブール型、数値型、および文字列型。これらのプリミティブ型は固定量のスペースを占有するため、より小さなメモリ領域、つまりスタックに格納できます。このストレージにより、変数の値をすばやく簡単に検索できるようになります。 (詳細については、http://www.w3school.com.cn/js/pro_js_value.asp を参照してください)
JavaScript で二重等号 (==) を使用して等しいかどうかを判断する暗黙的な変換メカニズム:
1, if両側が単純型:
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. 両辺が単純型である場合、型が異なる場合、最初に数値比較に変換されます (Boolean は 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); //truevar 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'); //truevar 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 メソッドがデフォルトで呼び出されます。
以上がJavascriptにおける二重等号の暗黙的な変換機構の例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。