gpt4 book ai didi

javascript - 为什么 "new Date().toString()"在给定 Javascript 运算符优先级的情况下可以工作?

转载 作者:行者123 更新时间:2023-12-03 00:06:07 26 4
gpt4 key购买 nike

MDN states Javscript 中有两个具有最高优先级的运算符:

  • 左关联成员运算符:foo.bar
  • 右关联 new 运算符:new Foo()

我通常明确地将两者分开:(new Date()).toString()
但我经常看到它们结合在一起:new Date().toString()

根据this answer ,第二种方式起作用的原因是,当两个运算符具有相同的优先级时,第二个运算符的结合性很重要。在这种情况下,成员运算符是左关联的,这意味着首先计算 new Date()

但是,如果是这样的话,为什么 new Date.toString() 会失败呢?毕竟,新日期just syntactic sugar对于new Date()。上面的论点说它应该有效,但显然不行。

我错过了什么?

最佳答案

syntax

MemberExpression :
PrimaryExpression
FunctionExpression
MemberExpression [ Expression ]
MemberExpression . IdentifierName
new MemberExpression Arguments

new foo().bar 无法解析为 new (foo().bar) 因为 foo().bar 不是一个成员表达式。此外,出于同样的原因,new foo() 不能被解析为 new (foo())。相反,new foo.bar被解析为new (foo.bar),因为foo.bar是有效的MemberExpression(解释 (new foo).bar 是不可能的,因为语法是贪婪的)。

也就是说,优先规则是:点击败new,new击败call(parens)。

.  -> new -> ()

此外,直接查看语法可以揭开将 new Foo 转换为 new Foo() 的语法糖的神秘面纱。很简单,NewExpression ← new NewExpression ← new PrimaryExpression:

NewExpression :
MemberExpression
new NewExpression

关于javascript - 为什么 "new Date().toString()"在给定 Javascript 运算符优先级的情况下可以工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17587808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com