以下表达式似乎按预期工作并返回当前时间戳.
new Date().getTime()
但是我无法理解为什么操作符在这里严格按照从左到右的顺序应用.
MDN表示成员(.)操作符的优先级高于新操作符.这意味着.必须在新的之前应用.所以表达式应该评估为:
new (Date().getTime())
但实际上它被评估为:
(new Date()).getTime()
我想必须有一些我忽略的东西,但我无法理解.
注意:我实际上并没有使用这个表达式(我更喜欢Date.now()方法).这只是我的好奇心.
解决方法
MDN优先级表并不正确; new运算符和属性访问运算符都是语法中MemberExpression非终结符的一部分.由于他们是左联合运算符,
new something.something
被评估为
(new something).something
Here是规范的相关部分.
因此在您的示例表达式中
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()