原文: Enforcing toString()
翻訳: Enforcing toString() in javascript
翻訳者: singleseeker
JavaScript は通常、メソッドまたは演算子は値を必要な型に自動的に変換する必要があるため、さまざまなエラーが発生する可能性があります。 Brian McKenna (@puffnfresh) 提案が次のテスト コードを提供しました:
Object.prototype.valueOf = function () {
throw new Error('明示的な toString を使用します');
[ sS ]* n
これらのコードにはどのような影響がありますか? プラス演算子を使用してオブジェクトを文字列に変換することはできなくなりました:
[code]
> 'Hello ' obj
エラー: 明示的な toString を使用してください
'[オブジェクト オブジェクト]'
> obj.toString()
'[オブジェクト オブジェクト]'
> 'Hello ' String(obj)
「こんにちは [オブジェクト オブジェクト]」では何が起こっていますか? オブジェクトを特定の基本型 T に変換するには、まずその値が基本型に変換され、次に T に変換されます。前の変換は 2 つのステップで完了します。
1. valueOf() メソッドを呼び出します。基本型を返し、終了
2. それ以外の場合は、メソッド toString() を呼び出します。基本型が返された場合は終了します。
3. それ以外の場合は、エラーをスローします。
最後の変換が数値の場合は、上記の valueOf() と toString の呼び出し順序になります。 最後の変換が文字列の場合、最初に toString が呼び出されます。 プラス演算子は値を数値型または文字列型に変換できますが、通常、
は数値演算に基づいてプリミティブ型
を生成します。
記事の冒頭に掲載したコード スニペットの代わりに、Object.prototype.valueOf() はオブジェクト自体を返します。これはネイティブ オブジェクトから継承されたオーバーライドされていないメソッドです:
コードをコピーします
true プラス演算子は最終的に toString() を呼び出します。 上記のコード スニペットは呼び出しをブロックし、メソッドを呼び出す前にエラーをスローします。
このエラー メッセージは必ずしも完全に正しいわけではないことに注意してください。
コードをコピー
エラー: 明示的な toString を使用してください。 しかし、このトリックは間違いなく便利です。
オブジェクトを実際に数値に変換したい場合は、とにかく独自の valueOf メソッドを呼び出す必要があります。
@singleseeker
Wordy: この記事は愚痴をこぼすために翻訳されており、知識点もよくまとめられていますが、英語を母国語としない外国人が書いた英語の技術記事としては、英語を母国語としない初心者の翻訳者にとって、それは本当に苦痛です。 以下に簡単な概要を示します。
1. 通常、valuOf() は、それ自体である未変換のオブジェクトを返すことを示します。2. Date オブジェクトを除き、プラス演算子はほとんどの場合、最初に valueof() メソッドを呼び出します。
3. () は明確な基本数値型を返します。オブジェクトが文字列に追加されるとき、toString() は呼び出されません。
Reference
1.オブジェクト (オブジェクト) をプリミティブに強制します
2.
JavaScript では、{} {} は何に相当しますか?