なぜ 2 だけが出力されるのでしょうか? 1 と 2 の両方を出力すべきではないでしょうか?
小伙看你根骨奇佳,潛力無限,來學(xué)PHP伐。
より具體的に言えば、通常、valueOf と toString の 2 つのメソッドのうち 1 つだけを呼び出すことができます。オブジェクトの種類に応じて、異なる判斷順序があります。具體的には:
1. オブジェクトを文字列に変換する場(chǎng)合、まずオブジェクトに toString() メソッドがあるかどうかを検出し、これを呼び出して元の値を返し、次に値を文字列に変換します。オブジェクトに toString() メソッドがない場(chǎng)合、またはこのメソッドがプリミティブ値を返さない場(chǎng)合。次に、js はオブジェクトに valueOf() メソッドがあるかどうかを検出し、存在する場(chǎng)合はそれを呼び出し、元の値も呼び出して返し、この値を文字列に変換します。オブジェクトの valueOf メソッドも toString メソッドも存在しない場(chǎng)合、TypeError 例外がスローされます。
2. オブジェクトが數(shù)値に変換される場(chǎng)合、toString() メソッドが検出されない場(chǎng)合、そのオブジェクトに valueOf() メソッドがあるかどうかが検出されます。その具體的な原理は上記と同じです。
3. すべての非日付オブジェクトの場(chǎng)合、オブジェクトのプリミティブ値への変換は基本的にオブジェクトの數(shù)値への変換であり、日付オブジェクトの場(chǎng)合はすべて最初に valueof() を呼び出します。が使用されます。
あなたの質(zhì)問に特有ですが、 a は日付オブジェクトではないため、変換が成功した後は、 valueof() メソッドが最初に呼び出されます。當(dāng)然、 toString() メソッドは再び呼び出されません。
a+'1' を?qū)g行すると、a.valueOf メソッドのみが呼び出され、toString メソッドは呼び出されません。まず、toValueOf メソッドと toString メソッドの仕組みを理解することができます。
これは js の解析メカニズムであるため、「+」を使用すると、特別な規(guī)定がない場(chǎng)合、js は自動(dòng)的に変換などの toString メソッドを呼び出します。 valueOfと書いた場(chǎng)合は當(dāng)然toStringの方が優(yōu)先されます
。加算操作を行う場(chǎng)合は、valueOf を呼び出すだけです。出力されないため、文字列に変換する必要はなく、もちろん toString はトリガーされません。
このように出力すると、両方のメソッドが呼び出されることがわかります: