new(Date)和new Date()有什么区别?

7
在JavaScript中,创建一个新对象的典型方法是像这样执行:new Date()。但是你也可以这样做:new (Date)。那么这两种方法有什么不同和优势呢?

9
“new (Date)” 这段代码令人烦恼,因为我不得不停下来反复阅读以理解它的含义。 - Raynos
你在哪里看到那个疯狂的标记了? - epascarello
你也可以写成 new Date;,但是像SLaks下面所描述的那样没有任何区别。 - Wojciech Bednarski
@epascarello,我在下面的评论中看到了SLaks的一个示例。 - Andrew Young
2个回答

11

没有区别。

new运算符需要一个函数引用作为操作数。
和其他运算符一样,操作数可以有括号。

()在没有参数的new表达式后是可选的。

然而,如果括号内有更复杂的表达式,它们可能会改变优先级顺序,例如在这个答案中所示。


那么你的意思是,写在lesscss.org上的使用指南的人真的没有理由像这样写吗?var parser = new(less.Parser);除了制造混淆之外?他们本可以像这样写:new less.Parser() - Andrew Young
我不知道他们为什么写那个。 - SLaks
1
似乎有一个差异(至少我在Chrome中看到了一个)。尝试:new Date().toString() vs new(Date).toString() - Dmitry B.
1
@DmitryBeransky 是的,有道理,至少在弄清楚原因后是这样的 :-) 所接受的语法是 new ctorExprnew ctorExpr(...),在后一种情况下,ctorExpr 被视为 (Date).toString,这不是一个有效的构造函数,因此它会抛出异常。也就是说,后者被解析为 new ((Date).toString) (),而前者是 (new (Date)()).toString()。这并不改变 (...) 是可选还是必需的,尽管它确实改变了它的解析方式。 - user166390
是的,有道理。但这意味着SLaks关于括号的说法并不完全正确(嗯,有点令人困惑)。括号不是“new”的一部分,而是表达式的一部分。换句话说,它不是“new (<expr>)”,而是“new <expr>”(其中<expr>是“(<exr>)”)。 - Dmitry B.
@DmitryBeransky:这就是我所说的“操作数”可以有括号的意思。你提到的其他例子正是我在最后一段所暗示的。 - SLaks

0

我相信后一种方式与第一种方式是相同的。我认为它将被解释为new Date,因为括号中没有任何要评估的内容。请注意,new Date等同于new Date()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接