在使用“新”运算符创建对象时,我们可以省略括号吗?

在使用“新”运算符创建对象时,我们可以省略括号吗?

我看到对象是这样创建的:

const obj = new Foo;

但我认为在创建对象时,括号不是可选的:

const obj = new Foo();

在ECMAScript标准中创建对象的前一种方法是否有效和定义?前一种创建对象的方式和后一种创建对象的方式有什么不同吗?一个比另一个更好吗?


慕尼黑8549860
浏览 482回答 3
3回答

三国纷争

引文大卫·弗拉纳根1:作为特例,对于new如果函数调用中没有参数,JavaScript只允许省略括号,从而简化了语法。下面是使用new操作员:o = new Object;  // Optional parenthesis omitted hered = new Date();  ...就我个人而言,我总是使用括号,即使构造函数没有参数。此外,贾林特如果省略括号可能会伤害你的感情。报告Missing '()' invoking a constructor,而且该工具似乎没有允许省略括号的选项。1大卫·弗拉纳根:JavaScript最终指南:第4版(第75页)

有只小跳蛙

两者之间存在差异:new Date().toString()工作正常,并返回当前日期。new Date.toString()抛出“TypeError:Date.toString不是构造函数"这是因为new Date()和new Date有不同的优先权。根据MDN我们感兴趣的JavaScript操作符优先级表的部分如下所示:╔════════════╦═════════════════════════════╦═══════════════╦═════════════╗║ Precedence ║        Operator type        ║ Associativity ║  Operators  ║╠════════════╬═════════════════════════════╬═══════════════╬═════════════╣║     18     ║ Member Access               ║ left-to-right ║ … . …       ║║            ║ Computed Member Access      ║ left-to-right ║  … [ … ]    ║║            ║ new (with argument list)    ║ n/a           ║ new … ( … ) ║╠════════════╬═════════════════════════════╬═══════════════╬═════════════╣║     17     ║ Function Call               ║ left-to-right ║ … ( … )     ║║            ║ new (without argument list) ║ right-to-left ║ new …       ║╚════════════╩═════════════════════════════╩═══════════════╩═════════════╝从本表中可以看出:new Foo()比new Foonew Foo()具有与.操作者new Foo具有较低优先级的级别。.操作者new Date().toString()因为它的计算值为(new Date()).toString()new Date.toString()抛出“TypeError:Date.toString不是构造函数“因为.比new Date(并高于“函数调用”),表达式的计算结果为(new (Date.toString))()同样的逻辑可以应用于… [ … ]接线员。new Foo有从右到左结合性new Foo()“联想性”不适用。我认为在实践中这没有任何区别。有关更多信息,请参见这,这个所以问题一个比另一个更好吗?知道了这一切,我们可以假设new Foo()是首选。

慕斯709654

我不认为当你使用“新”操作符时没有任何区别。要注意养成这种习惯,因为这两行代码并不相同:var someVar = myFunc; // this assigns the function myFunc to someVarvar someOtherVar = myFunc();  // this executes myFunc and assigns the returned value to someOtherVar
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript