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

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

Pythonはデータサイエンスや機械学習により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、簡潔な構文とリッチライブラリエコシステムで知られており、データ分析とWeb開発に適しています。 2。JavaScriptは、フロントエンド開発の中核です。 node.jsはサーバー側のプログラミングをサポートしており、フルスタック開発に適しています。

JavaScriptは、最新のブラウザにすでに組み込まれているため、インストールを必要としません。開始するには、テキストエディターとブラウザのみが必要です。 1)ブラウザ環境では、タグを介してHTMLファイルを埋め込んで実行します。 2)node.js環境では、node.jsをダウンロードしてインストールした後、コマンドラインを介してJavaScriptファイルを実行します。

Quartzタイマーを使用してタスクをスケジュールする場合、Quartzでタスク通知を事前に送信する方法、タスクの実行時間はCron式によって設定されます。今...


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

WebStorm Mac版
便利なJavaScript開発ツール

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター
