1はじめに
実際の開発では、比較演算子と合同演算子の両方が頻繁に使用されます。
両側で型が異なる場合、比較演算子は暗黙的な型変換後に比較結果を取得します。
ただし、参照型の暗黙的な型変換にはいくつかの落とし穴があります。実際の開発では、少し不注意をすると
、次のようなバグが発生します。
[] == 0 // true
したがって、最下層が何をするのかを理解することをお勧めします
2参照型と基本データ型の変換
暗黙的な変換では、通常、参照型が基本データ型に変換されてから比較が実行されます。
変換の目的は、基本データ型または元の値を取得することだけです。
参照データ型を変換するときは、通常、valueOfとtoStringの2つのAPIが使用されます。
- valueOfメソッドは、オブジェクトを元の値に変換するために使用されます。オブジェクトに元の値がない場合、valueOfはオブジェクト自体を返します。valueOfメソッドを自分で呼び出す必要はめったにありません。JavaScriptは、期待される元の値を持つオブジェクトに遭遇すると、自動的にメソッドを呼び出します。
- toStringメソッドは、オブジェクトを表す文字列を返します
2.1オブジェクトから文字列
簡単な検証のために、プロトタイプのvalueOfとtoStringを書き直します。時間は限られており、ロジックは完全に厳密ではない場合があります。時間があれば、アイデアに応じてさらに多くのケースを作成できます。
const log = console.log
Object.prototype.toString = () => 'a'
Object.prototype.valueOf = () => 'b'
log(Object() == 'a') // false
log(Object() == 'b') // true
Object.prototype.toString = () => 'a'
log(Object() == 'a') // true
最初にvalueOfを呼び出し、次にtoStringを呼び出します
2.2番号へのオブジェクト
Object.prototype.toString = () => 1
Object.prototype.valueOf = () => 2
log(Object() == 1)
log(Object() == 2) // true
最初にvalueOfを呼び出し、次にtoStringを呼び出します
2.3配列から文字列へ
Array.prototype.toString = () => 'a'
Array.prototype.valueOf = () => 'b'
log([] == 'a') // false
log([] == 'b') // true
最初にvalueOfを呼び出し、次にtoStringを呼び出します
Array.prototype.join = () => 'a'
log([] == 'a') // true
基になる呼び出しは結合です
この時点で、記事の冒頭で述べたように、[] == 0が真であることは容易に理解できます。
- 参照型と基本型が比較されていることが検出されたため、jsは暗黙的に参照型を基本型に変換してから比較します。
- 暗黙的な変換では、valueOfが最初に呼び出され、配列であるため、joinメソッドの実行結果がvalueOfで返されます。
- 問題はおなじみになります '' == 0、trueを返します
3まとめ
基本型への参照型。目的は元の値を取得することです。最下層は最初にvalueOfを呼び出し、次にtoString
プロセスを呼び出します。いずれかのメソッドが元の値を取得すると、戻ります。それ以外の場合は、次のメソッドに進みます。
元の場合値が取得されない場合は、例外をスローします