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好吧,好的一面是,这是一个维基,所以如果你有耐心,你可以修复它:)但在很多情况下,这是一个冷淡的安慰,这是一个很好的例子:修复它需要重新修改表,弄清楚具体怎么做可能需要一段时间。@最后面的答案更新了一些可能会让你头疼的东西(我也一样)