Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用“new”操作符创建对象时是否可以省略括号?_Javascript_New Operator - Fatal编程技术网

Javascript 使用“new”操作符创建对象时是否可以省略括号?

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

我见过这样创建对象:

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

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

引用1:

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

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

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

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


1 David Flanagan:page 75

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

两者之间没有区别。

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

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

两者之间存在差异:

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

优先 操作员类型 结合性 操作员 18 成员访问计算的成员访问新参数列表 从左到右从左到右不适用 … . … … […]新的… 17 不带参数列表的函数调用new 从左到右从右到左 ……新…
为什么JSLint鼓励使用括号?我想这被认为是更一致的。我发现有趣的是,许多JavaScript开发人员使用括号仅仅是因为工具JSLint告诉他们这样做,特别是考虑到,从发明这种语言的人那里,对于无参数构造函数,在新类上不使用任何括号。如果这不意味着“固执己见”,我不知道是什么…@ack好吧,在这种情况下,如果没有看到语言的发明者展示他们语言的某些特性,那就很奇怪了,在构造函数上省略括号的选项。如果他们没有添加该功能,我们就不会问是否应该首先使用它。不使用它的一个实际原因是:new Object.func并不等同于new Object.func。通过始终包含括号,可以消除犯此错误的可能性。如果要消除犯错误的可能性,应使用new Object.func。但我认为使用额外的括号和额外的等号,如I==VS===,不学习语言的一个坏借口。更新参考:ECMAScript 2017。DR:注意新a.b与新a.b不同,在前一种情况下,首先访问a.b,而在后一种情况下,首先创建一个新a。它在ES5和ES3中也有很好的定义-返回调用构造函数的[[Construct]]内部方法的结果,不提供任何参数,即参数的空列表。最后,真正回答问题并指出细微差别的人!哇,谢谢。这让我想起了另一种解释得很好的语言,它确切地说明了为什么新Foo比新Foo更受欢迎。到目前为止最好的答案。很棒的答案,优先表和附带的解释使它完全清楚。很高兴你解释了为什么写新的Object.something和new Object.something都是正确的。很好的解释,但是我不同意这个结论,并且仍然认为如果你懂你的语言,不使用括号是很好的。顺便说一句,如果您不知道JS优先级,您也可以使用new Date.toString,相同的字符计数,并且比new Date.toString更明确。我会说语法盐,但ymmv。如果不需要,我会说添加它们是语法糖如果你有省略分号的习惯,问题就更大了-