为什么表达式 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()
以下表达式似乎按预期工作,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()