【发布时间】:2013-07-09 09:30:29
【问题描述】:
MDN states,Javscript 中有两个运算符共享最高优先级:
- 左关联成员运算符:
foo.bar - 右关联新运算符:
new Foo()
我通常明确地将两者分开:(new Date()).toString()
但我经常看到他们两个结合在一起:new Date().toString()
根据this answer,第二种方法起作用的原因是,当两个运算符具有相同的优先级时,第二个运算符的关联性很重要。在这种情况下,成员运算符是左关联的,这意味着首先计算 new Date()。
但是,如果是这样,那为什么new Date.toString() 会失败?毕竟,new Date 是 just syntactic sugar 对应于 new Date()。上面的论点说它应该有效,但显然无效。
我错过了什么?
【问题讨论】:
-
因为语法糖没有扩展到实例化和成员访问。这取决于编译器。有点类似的场景:VB.NET 有
Dim x As New ...,但我不相信我们可以做到Dim x As New Date().ToString()。我们可以做Dim x As String = new Date().ToString()。 -
()运算符将在.访问它的属性之前执行构造函数。 -
@ps2goat 你是对的,但根据下面的答案,这是由于指定的语法而不是编译器的奇思妙想。
-
'new' 的语法规则很复杂,很容易导致错误。我首选的解决方案是让“new”成为一个静态方法,它在内部调用“new this (...)”。然后创建新实例的语法看起来就像任何其他方法调用一样,我不必三思而后行。例如我可以写: MyDate..new().toString() .
标签: javascript parsing operator-precedence