ホームページ >ウェブフロントエンド >jsチュートリアル >Javascriptにおける二重等号の暗黙的な変換機構の例

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

黄舟
黄舟オリジナル
2017-10-27 09:28:181365ブラウズ

Javascriptには、二重等号(==)と三重等号(===)の2種類の等価関係があります。 2 つの等号 (==) は値の等しいことを示し、3 つの等号 (===) は厳密な等しい (値と型が完全に等しいかどうか) を示します。

それでは、いくつかの常識的な知識があります:

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 サイトの他の関連記事を参照してください。

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