2015-09-17 14 views
6

次の式は意図したとおりに動作し、現在のタイムスタンプを返します。式の演算子が新しいDate()。getTime()が厳密な左から右の順序で適用されるのはなぜですか?

new Date().getTime() 

ただし、演​​算子が厳密な左から右の順序で適用されている理由を理解できません。

MDNは、メンバー(.)の演算子がnewよりも高いと言います。これは、.newより前に適用する必要があることを意味します。だから、表現のように評価されるべきである:

new (Date().getTime()) 

しかし、実際には、それは次のように評価されます

(new Date()).getTime() 

私が見落としてきた何かがなければならないと思いますが、私は何を理解することはできません。

注::私は実際にこの表現を使用しません(私はDate.now()メソッドを好む)。それは私の好奇心です。

答えて

7

MDN優先順位テーブルは実際には正しくありません。 new演算子とプロパティアクセス演算子はすべて、文法の中で非終端記号MemberExpressionの一部です。彼らは左結合演算子ですので

(new something).something 

Hereが仕様の関連部分であるとして、

new something.something 

が評価されます。

は、したがって、あなたのサンプル式

new Date().getTime() 

.の全体の左側はMemberExpressionとして解析されます。どのような種類のメンバー表現ですか?それはnew MemberExpressionのプロダクションなので、パーズツリーの深さが深くなり、左の連想動作が得られます。

編集 —他に何か考えました。我々は、オブジェクトがあるとしましょう:

var obj = { 
    findConstructor: function(name) { 
    return window[name]; 
    } 
}; 

さて、このオブジェクトを使用して時刻を取得するためにその式を試してみましょう:あなたのエラーをあげる

new obj.findConstructor("Date")().getTime() 

こと。 (私はここで薄い氷の上にいます:)それはそれを解析するので、それは明らかに動作しません。代わりに、明示的なかっこを追加する必要があります。

(new obj.findConstructor("Date")()).getTime() 
+1

リンク先のより詳細な表 - https://developer.mozilla。org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#テーブル - 同じ優先順位を持つ3つのテーブルを示します。 –

+0

確かにそうです、それはそれが実際に働く方法のためにいいです:) – Pointy

+0

ありがとう。今私はMDNを信頼できません)。 – hindmost

関連する問題