2

どのJavascript言語ルールが次の変換の奇妙さにつながりますか?

new Date() - 2 => number
new Date() * 2 => number
new Date() / 2 => number

しかし

new Date() + 2 => string

valueOf()+演算子は、オブジェクトのメソッドを使用してDateオブジェクトを数値に変換すると思っていました。次の例のように:

{valueOf: function() {return 1;}} + 2 => number

の場合の違いは何Dateですか?

4

3 に答える 3

3

あなたがやろうとすると

new Date() + 2  

文字列の連結を行っている(つまり、と同等new Date()のオブジェクトの文字列表現を返している)、Date(new Date()).toString()

その他の場合、算術演算子を使用しています(この場合new Date()、「Epoch」からミリ秒を返します)

「一貫性のある」動作を実現するには、次の+(new Date())ように使用するだけで型強制を行います。

+(new Date()) - 2 => number
+(new Date()) * 2 => number
+(new Date()) / 2 => number
+(new Date()) + 2 => number
于 2012-09-26T10:31:55.550 に答える
1

一貫性がないわけではありません。上記のコードで暗黙的に呼び出されるメソッドを試しd = new Date(); console.log(d);てみてください。デフォルトでは文字列が返されます。toStringJSは大まかに型付けされて+おり、オーバーロードされた演算子(文字列を連結し、算術演算を行う)であるため、dateオブジェクトとint(2)の両方が強制されます。

この背後にあるロジックは次のようなものだと思います。どちらのオペランドも直接互換性がない場合、両方とも3番目のタイプに強制されます。日付はデフォルトで文字列に変換され、数値でも変換できるため、JSはそれが必要なものであると想定します(これが最も論理的な解釈です)。
他の例では、解釈の余地がないさまざまなオペランドを使用しているため、日付オブジェクトの数値が使用されます

ただし、これは簡単な修正です。

+(new Date()) + 2;//+ coerces new Date() to int

ここにいくつかの詳細があります

于 2012-09-26T10:35:35.877 に答える
0

Javascriptの仕様を調べた後、加算演算子のコンテキストでDateオブジェクトの特殊なケースが実際にあります。

http://ecma-international.org/ecma-262/5.1/#sec-11.6.1

Dateオブジェクトの変換は、他のオブジェクトとは異なる方法で処理されます。

手順5および6のToPrimitiveの呼び出しでは、ヒントは提供されません。Dateオブジェクトを除くすべてのネイティブECMAScriptオブジェクトは、ヒント番号が指定されているかのようにヒントの不在を処理します。日付オブジェクトは、ヒント文字列が指定されたかのようにヒントの不在を処理します。

やる気は理解できたと思いますが、言葉のルールとしてはかなり醜い感じがします。

于 2012-09-26T13:03:04.347 に答える