为什么表达式 new Date().getTime() 中的运算符严格按照从左到右的顺序应用?

Why are operators in the expression new Date().getTime() applied in strict left-to-right order?

以下表达式似乎按预期工作,return 当前时间戳。

new Date().getTime()

但是我无法理解为什么运算符在这里严格按照从左到右的顺序应用。

MDN 表示成员 (.) 运算符的优先级高于 new。这意味着必须在 new 之前应用 .。所以表达式应该被评估为:

new (Date().getTime())

但实际上评价为:

(new Date()).getTime()

我想一定是我忽略了什么,但我不明白是什么。

注意:我实际上并没有使用这个表达式(我更喜欢Date.now()方法)。这只是我的好奇心。

MDN 优先级 table 并不正确; new 运算符和 属性 访问运算符都是语法中 MemberExpression 非终结符的一部分。由于它们是左结合运算符,

new something.something

被评估为

(new something).something

Here 是规范的相关部分。

因此在您的示例表达式中

new Date().getTime()

. 的整个左侧被解析为 MemberExpression。它是什么样的MemberExpression?这是一个 new MemberExpression 产生式,因此它更深入到解析树中,并为我们提供了左关联行为。

edit — 我刚想到的其他事情。假设我们有一个对象:

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

现在,让我们尝试使用该表达式来获取使用此对象的时间:

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

这会给你一个错误。 (我在这里如履薄冰:)那是因为它将其解析为

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

这显然行不通。相反,您必须添加显式括号:

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