为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑8549860 2019-06-15 18:00:58
在使用“新”运算符创建对象时,我们可以省略括号吗?我看到对象是这样创建的:const obj = new Foo;但我认为在创建对象时,括号不是可选的:const obj = new Foo();在ECMAScript标准中创建对象的前一种方法是否有效和定义?前一种创建对象的方式和后一种创建对象的方式有什么不同吗?一个比另一个更好吗?
查看完整描述

3 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

引文大卫·弗拉纳根1:

作为特例,对于new如果函数调用中没有参数,JavaScript只允许省略括号,从而简化了语法。下面是使用new操作员:

o = new Object;  // Optional parenthesis omitted hered = new Date();  ...

就我个人而言,我总是使用括号,即使构造函数没有参数。

此外,贾林特如果省略括号可能会伤害你的感情。报告Missing '()' invoking a constructor,而且该工具似乎没有允许省略括号的选项。


1大卫·弗拉纳根:JavaScript最终指南:第4版(第75页)


查看完整回答
反对 回复 2019-06-15
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

两者之间存在差异:

  • 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 …       ║

╚════════════╩═════════════════════════════╩═══════════════╩═════════════╝



从本表中可以看出:
  1. new Foo()new Foo

    new Foo()具有与.操作者

    new Foo具有较低优先级的级别。.操作者

    new Date().toString()因为它的计算值为(new Date()).toString()

    new Date.toString()抛出“TypeError:Date.toString不是构造函数“因为.new Date(并高于“函数调用”),表达式的计算结果为(new (Date.toString))()

    同样的逻辑可以应用于… [ … ]接线员。

  2. new Foo从右到左结合性new Foo()“联想性”不适用。我认为在实践中这没有任何区别。有关更多信息,请参见这,这个所以问题


一个比另一个更好吗?

知道了这一切,我们可以假设new Foo()是首选。


查看完整回答
反对 回复 2019-06-15
?
慕斯709654

TA贡献1840条经验 获得超5个赞

我不认为当你使用“新”操作符时没有任何区别。要注意养成这种习惯,因为这两行代码并不相同:

var someVar = myFunc; // this assigns the function myFunc to someVarvar someOtherVar = myFunc(); 
// this executes myFunc and assigns the returned value to someOtherVar


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 481 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信