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

前端之家收集整理的这篇文章主要介绍了javascript – 为什么表达式中的运算符new Date().getTime()以严格的从左到右的顺序应用?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
以下表达式似乎按预期工作并返回当前时间戳.
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()
原文链接:https://www.f2er.com/js/240763.html

猜你在找的JavaScript相关文章