console.log( [] == ![] ) // 真 console.log( {} == !{} ) // 偽 文字列、数値、ブール値の等価性を比較する場合、問題は比較的単純です。しかし、オブジェクトを比較するとなると、問題は複雑になります。 ECMAScript の元の等価演算子と不等価演算子は、比較を実行する前にオブジェクトを類似の型に変換しました。後になって、この変換が合理的であったかどうかを疑問視する人もいました。最後に、ECMAScript のソリューションは、次の 2 つの演算子セットを提供することです。
ECMAScript の等価演算子は、2 つの等号 (==) で表されます。2 つのオペランドが等しい場合は、true を返します。この演算子は、最初にオペランドを変換し (通常は強制変換と呼ばれます)、次にそれらの等価性を比較します。 異なるデータ型を変換する場合、等価演算子と不等価演算子については、次の基本的な変換ルールがJS Elevationという本に記載されています。 ① 一方のオペランドがブール値の場合、等価性を比較する前に数値に変換されます。つまり、false は 0 に変換され、true は 1 に変換されます。 ② 一方のオペランドが文字列で、もう一方のオペランドが数値の場合、等しいかどうか比較する前に文字列を数値に変換します。 ③. 一方のオペランドがオブジェクトでもう一方がそうでない場合は、オブジェクトの valueOf() メソッドを呼び出し、取得したプリミティブ型の値を使用して、前の規則に従って比較します。 これら 2 つの演算子は、比較を実行するときに次の規則に従います。 ①、nullとundefinedは等しい ② 等価性を比較する前に、nullとundefinedを他の値に変換することはできません ③. 一方のオペランドが NaN の場合、等価演算子は false を返し、不等価演算子は true を返します。重要: 両方のオペランドが NaN の場合でも、規則により NaN は NaN と等しくないため、等価演算子は false を返します。 ④. 両方のオペランドがオブジェクトの場合、それらが同じオブジェクトであるかどうかを比較します。両方のオペランドが同じオブジェクトを指している場合、等価演算子はtrueを返します。そうでない場合はfalseを返します。 ここで余談ですが、[] と {} はどちらも参照型であり、ヒープ メモリに格納され、スタック メモリには、このヒープ メモリに対応するデータを指す 1 つ以上のアドレスが存在します。したがって、参照型データに対して == 演算子を使用する場合、比較されるのは実際の値ではなくアドレスです。 ここで、[] == ! [] の結果がなぜ真なのかを議論しましょう。①. オペレータの優先度に応じて、! の優先度は == よりも高いので、最初に実行されます![] !変数はブール型に変換できます。null、undefined、NaN、空文字列 ('') の否定は true になり、それ以外は false になります。 つまり、[]演算後の結果は偽です つまり、[] == ! [] は [] == false と同等です。 ② 上記のルール(オペランドの1つがブール値の場合、等価性を比較する前に数値に変換されます。falseは0に変換され、trueは1に変換されます)に従って、falseを0に変換する必要があります。 つまり、[] == ! [] は [] == false と同等であり、これは [] == 0 と同等です。 ③. 上記のルールに従って(一方のオペランドがオブジェクトで、もう一方のオペランドがオブジェクトでない場合は、オブジェクトの valueOf() メソッドが呼び出され、取得したプリミティブ型の値が前のルールに従って比較されます。オブジェクトに valueOf() メソッドがない場合は、toString() が呼び出されます) 空の配列の場合、[].toString() -> '' (空の文字列を返します) つまり、[] == 0 は '' == 0 と同等である。 ④ 上記の規則に従って(一方のオペランドが文字列で、もう一方のオペランドが数値の場合、等価性を比較する前に文字列を数値に変換します) Number('') -> 0 を返します これは 0 == 0 と同等であり、当然 true を返します。 要約すると:
{} == !{} の場合も同様です。キーは {}.toString() -> NaN (NaN を返します) 上記の規則によれば(1つのオペランドがNaNの場合、等価演算子はfalseを返します) 要約すると:
すると、次の 2 つの質問には誰でも簡単に答えられると思います。 console.log( [] == !{} ) // 真 console.log( {} == ![] ) // false 要約するこれで、[] == ![] は true と評価されるのに、{} == !{} は false と評価されるという、あまり知られていない JS の問題に関するこの記事は終了です。JS [] == ![] が true と評価されることの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援してください。 |
>>: Linux サーバーでフォルダー、ファイル、解凍コマンドを削除する方法
包括的なドキュメントgithubアドレスhttps://github.com/RocketChat/...
目次1. Dockerファイル2. pom 構成3. イメージプッシュ4. k8s デプロイメント前...
この実験のテスト環境: Windows 10+cmd+MySQL5.6.36+InnoDB 1. ト...
1. 公式ウェブサイトにアクセスして、jdk-8u162-linux-x64.tar.gzなどのLi...
MySQL と接続関連のタイムアウト序文:今日、同僚から、データ量が多いときに MySQL データベ...
この記事では、参考までに、簡単な計算機を実装するためのJavaScriptの具体的なコードを紹介しま...
最近、MySQL の起動中にエラーが発生しました。エラー メッセージは次のとおりです。 エラー 20...
スクロール バーを下に引くと、主にposition:fixed;スタイルにより、フローティング ボッ...
Dockerfile の紹介Docker は、Dockerfile の内容を読み取ってイメージを自動...
ウェブサイトの互換性のデバッグは本当に面倒です。今日のウェブサイト デザイナーは、以前よりもはるかに...
目次1. クライアントとサーバー間の通信方法2. クエリキャッシュ3. クエリ最適化処理4. クエリ...
一部のWebサイトでアップロードする場合、「参照」ボタンをクリックすると、[ファイルの選択]ダイアロ...
序文フィールドの追加は誰でもよく知っていると思います。簡単に記述できます。MySQL テーブルにフィ...
この記事では、主に 2 種類の下線の動的効果について説明します。1 つ目は、ホバーすると X 軸が内...
JDBCデータベースリンクと関連メソッドのカプセル化の詳細な説明MySQL データベースを使用して、...