我见过这样创建对象:
const obj = new Foo;
但我认为括号在创建对象时是不可选的:
const obj = new Foo();
前一种创建对象的方式是否有效并在ECMAScript标准中定义?前一种创建对象的方式和后一种创建对象的方式有什么区别吗?两者孰优孰劣?
我见过这样创建对象:
const obj = new Foo;
但我认为括号在创建对象时是不可选的:
const obj = new Foo();
前一种创建对象的方式是否有效并在ECMAScript标准中定义?前一种创建对象的方式和后一种创建对象的方式有什么区别吗?两者孰优孰劣?
当前回答
两者之间没有区别。
其他回答
我不认为当你使用“new”操作符时有任何区别。要小心养成这种习惯,因为这两行代码是不一样的:
var someVar = myFunc; // this assigns the function myFunc to someVar
var someOtherVar = myFunc(); // this executes myFunc and assigns the returned value to someOtherVar
两者之间没有区别。
如果没有要传递的参数,则括号是可选的。省略它们只是语法上的糖。
https://262.ecma-international.org/6.0/#sec-new-operator-runtime-semantics-evaluation
下面是ES6规范中定义这两个变体如何操作的部分。无括号变量传递一个空参数列表。
有趣的是,这两种形式有不同的语法含义。当您试图访问结果的成员时,就会出现这种情况。
new Array.length // fails because Array.length is the number 1, not a constructor
new Array().length // 0
引用大卫·弗拉纳根的话:
作为一种特殊情况,仅对于new操作符,JavaScript允许在函数调用中没有参数时省略圆括号,从而简化了语法。下面是一些使用new操作符的例子: o = new对象;//此处省略可选括号 d = new Date(); ...
就我个人而言,我总是使用圆括号,即使构造函数没有参数。
此外,如果省略括号,JSLint可能会伤害您的感情。它报告Missing '()'调用了一个构造函数,并且似乎没有一个选项可以让工具容忍圆括号遗漏。
1 David Flanagan: JavaScript权威指南:第4版(第75页)