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开发人员只使用括号。