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

Javascript 为什么表达式new Date().getTime()中的运算符严格按从左到右的顺序应用?,javascript,operators,Javascript,Operators,下面的表达式似乎按预期工作并返回当前时间戳 new Date().getTime() 然而,我不明白为什么这里的运算符是严格按从左到右的顺序应用的 表示成员()运算符的优先级高于新的。这意味着必须在新建之前应用。因此,表达式应计算为: new (Date().getTime()) (new Date()).getTime() 但事实上,它被评估为: new (Date().getTime()) (new Date()).getTime() 我想一定有什么我忽略了,但我不明白是什么 注意

下面的表达式似乎按预期工作并返回当前时间戳

new Date().getTime()
然而,我不明白为什么这里的运算符是严格按从左到右的顺序应用的

表示成员(
)运算符的优先级高于
新的
。这意味着必须在
新建之前应用
。因此,表达式应计算为:

new (Date().getTime())
(new Date()).getTime()
但事实上,它被评估为:

new (Date().getTime())
(new Date()).getTime()
我想一定有什么我忽略了,但我不明白是什么


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

MDN优先级表并不正确;
new
运算符和属性访问运算符都是语法中MemberExpression非终结符的一部分。因为它们是左关联运算符

new something.something
被评估为

(new something).something
是规范的相关部分

因此,在示例表达式中

new Date().getTime()
的整个左侧被解析为MemberExpression。这是什么样的表达?这是一个
新的MemberExpression
产品,它深入到解析树中,为我们提供了左关联行为

编辑-我刚刚想到的其他东西。假设我们有一个对象:

var obj = {
  findConstructor: function(name) {
    return window[name];
  }
};
现在,让我们尝试使用该表达式获取使用此对象的时间:

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

new (obj.findConstructor("Date")().getTime)()
这显然行不通。相反,您必须添加显式括号:

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

它链接到的更详细的表显示了三个具有相同的优先级。确实如此,这很好,因为它实际上就是这样工作的:)谢谢。现在我不能相信MDN。)@hindmost好吧,好的一面是,这是一个维基,所以如果你有耐心,你可以修复它:)但在很多情况下,这是一个冷淡的安慰,这是一个很好的例子:修复它需要重新修改表,弄清楚具体怎么做可能需要一段时间。@最后面的答案更新了一些可能会让你头疼的东西(我也一样)