JS参照型は暗黙の型変換で正確に何をしますか

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が真であることは容易に理解できます。

  1. 参照型と基本型が比較されていることが検出されたため、jsは暗黙的に参照型を基本型に変換してから比較します。
  2. 暗黙的な変換では、valueOfが最初に呼び出され、配列であるため、joinメソッドの実行結果がvalueOfで返されます。
  3. 問題はおなじみになります '' == 0、trueを返します

3まとめ

基本型への参照型。目的は元の値を取得することです。最下層は最初にvalueOfを呼び出し、次にtoString
プロセスを呼び出します。いずれかのメソッドが元の値を取得すると、戻ります。それ以外の場合は、次のメソッドに進みます。
元の場合値が取得されない場合は、例外をスローします

おすすめ

転載: blog.csdn.net/qq_41109610/article/details/114242676