我见过以这种方式创建的对象:
const obj = new Foo;
但是我认为在创建对象时括号不是可选的:
const obj = new Foo();
前一种创建对象的方法是否有效并在 ECMAScript 标准中定义?前一种创建对象的方式与后一种方式有什么区别吗?一个比另一个更受欢迎吗?
原文由 Behrang 发布,翻译遵循 CC BY-SA 4.0 许可协议
我见过以这种方式创建的对象:
const obj = new Foo;
但是我认为在创建对象时括号不是可选的:
const obj = new Foo();
前一种创建对象的方法是否有效并在 ECMAScript 标准中定义?前一种创建对象的方式与后一种方式有什么区别吗?一个比另一个更受欢迎吗?
原文由 Behrang 发布,翻译遵循 CC BY-SA 4.0 许可协议
两者有区别:
new Date().toString()
完美运行并返回当前日期new Date.toString()
抛出“ TypeError: Date.toString is not a constructor ”发生这种情况是因为 new Date()
和 new Date
具有不同的优先级。根据 MDN, 我们感兴趣的 JavaScript 运算符优先级表部分如下所示:
优先级操作员类型结合性运营商18会员权限
计算成员访问
new
(带参数列表)左到右
左到右
不适用… . …
… [ … ]
new … ( … )
17函数调用
new
(无参数列表)左到右
右到左… ( … )
new …
从这个表可以看出:
new Foo()
优先级高于 new Foo
new Foo()
与 .
运算符具有相同的优先级
new Foo
比 .
运算符低一级优先级
new Date().toString()
完美工作,因为它评估为 (new Date()).toString()
new Date.toString()
抛出“ TypeError: Date.toString is not a constructor ” 因为 .
的优先级高于 new Date
和“调用函数”(以及更高的表达式)评估为 (new (Date.toString))()
相同的逻辑可以应用于 … [ … ]
运算符。
new Foo
具有 从右到左的 关联性,对于 new Foo()
“关联性”不适用。我认为在实践中它没有任何区别。有关其他信息,请参阅 此 SO 问题一个比另一个更受欢迎吗?
了解所有这些,可以假设 new Foo()
是首选。
原文由 traxium 发布,翻译遵循 CC BY-SA 4.0 许可协议
13 回答13k 阅读
7 回答2.2k 阅读
3 回答1.3k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
6 回答1.1k 阅读
引用 David Flanagan 1 的话:
就个人而言,我总是使用括号,即使构造函数不带参数也是如此。
此外,如果省略括号, JSLint 可能会伤害您的感情。它报告
Missing '()' invoking a constructor
,并且该工具似乎没有容忍括号遗漏的选项。1 David Flanagan: JavaScript 权威指南:第 4 版(第 75 页)