Javascript 使用“创建对象时,是否可以省略括号?”;新";操作人员

Javascript 使用“创建对象时,是否可以省略括号?”;新";操作人员,javascript,new-operator,Javascript,New Operator,我见过这样创建对象: const obj = new Foo; 但我认为在创建对象时,括号不是可选的: const obj = new Foo(); 前一种创建对象的方法是否有效并在ECMAScript标准中定义?前一种创建对象的方式和后一种创建对象的方式有什么区别吗?一个优先于另一个吗?引用1: 作为特例,仅对于new操作符,JavaScript通过允许在函数调用中没有参数时省略括号简化了语法。以下是使用新的运算符的一些示例: o = new Object; // Optional pa

我见过这样创建对象:

const obj = new Foo;
但我认为在创建对象时,括号不是可选的:

const obj = new Foo();
前一种创建对象的方法是否有效并在ECMAScript标准中定义?前一种创建对象的方式和后一种创建对象的方式有什么区别吗?一个优先于另一个吗?

引用1:

作为特例,仅对于
new
操作符,JavaScript通过允许在函数调用中没有参数时省略括号简化了语法。以下是使用
新的
运算符的一些示例:

o = new Object;  // Optional parenthesis omitted here
d = new Date();  

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

此外,如果省略括号,可能会伤害您的感情。它报告调用构造函数的
缺少“()”,
,并且该工具似乎没有允许省略括号的选项


大卫·弗拉纳根:(第75页)

引用1:

作为特例,仅对于
new
操作符,JavaScript通过允许在函数调用中没有参数时省略括号简化了语法。以下是使用
新的
运算符的一些示例:

o = new Object;  // Optional parenthesis omitted here
d = new Date();  

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

此外,如果省略括号,可能会伤害您的感情。它报告调用构造函数的
缺少“()”,
,并且该工具似乎没有允许省略括号的选项



1 David Flanagan:(第75页)

如果没有要传递的参数,括号是可选的。省略它们只是语法上的甜点。

如果没有要传递的参数,则括号是可选的。省略它们只是语法上的糖分。

两者之间没有区别。

两者之间没有区别。

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

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

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

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

以下是ES6规范的一部分,它定义了这两个变体的操作方式。无括号变量传递一个空参数列表

有趣的是,这两种形式有不同的语法意义。当您尝试访问结果的成员时,会出现此问题

new Array.length // fails because Array.length is the number 1, not a constructor
new Array().length // 0

以下是ES6规范的一部分,它定义了这两个变体的操作方式。无括号变量传递一个空参数列表

有趣的是,这两种形式有不同的语法意义。当您尝试访问结果的成员时,会出现此问题

new Array.length // fails because Array.length is the number 1, not a constructor
new Array().length // 0

两者之间存在差异:

  • new Date().toString()
    工作正常并返回当前日期
  • new Date.toString()
    抛出“类型错误:Date.toString不是构造函数”
这是因为
newdate()
newdate
具有不同的优先级。根据我们感兴趣的JavaScript运算符优先级表部分,如下所示:

优先 操作员类型 结合性 操作员 18 成员访问权限
计算成员访问权限
new
(带参数列表) 从左到右
从左到右
不适用

.[…]

新建…(…)
17 函数调用新的(无参数列表) 从左到右
从右到左
…(…)

新建…

两者之间存在差异:

  • new Date().toString()
    工作正常并返回当前日期
  • new Date.toString()
    抛出“类型错误:Date.toString不是构造函数”
这是因为
newdate()
newdate
具有不同的优先级。根据我们感兴趣的JavaScript运算符优先级表部分,如下所示:

优先 操作员类型 结合性 操作员 18 成员访问权限
计算成员访问权限
new
(带参数列表) 从左到右
从左到右
不适用

.[…]

新建…(…)
17 函数调用新的(无参数列表) 从左到右
从右到左
…(…)

新建…

为什么JSLint鼓励使用括号?我想这被认为是更一致的。我发现有趣的是,许多JavaScript开发人员使用括号仅仅是因为“工具(JSLint)告诉他们这样做”,特别是考虑到“语言发明者”的例子对于无参数构造函数,不要在
newclass
上使用任何括号。如果这不意味着“固执己见”,我不知道是什么…@ack好吧,如果没有看到语言的发明者展示他们语言的某些特性(在本例中,省略构造函数括号的选项),那就很奇怪了。如果他们没有添加该功能,我们就不会问是否应该首先使用它。不使用它的一个实际原因是:
new Object.func()
不等同于
new Object().func()
。通过始终包含括号,可以消除犯此错误的可能性。如果要消除犯错误的可能性,应使用
(新对象).func()
。但我认为使用额外的括号和额外的等号,如<代码>=<代码> vs>代码>==,这是不学习语言的一个坏借口。为什么JSLLT鼓励使用括号?我猜它只是被认为更一致。我发现有趣的是,许多JavaScript开发人员只使用括号。