我们在使用"new"运算符创建对象时可以省略括号吗?

12 浏览
0 Comments

我们在使用"new"运算符创建对象时可以省略括号吗?

我见过以这种方式创建对象:\n

const obj = new Foo;

\n但是我认为在创建对象时括号是不可缺少的:\n

const obj = new Foo();

\n前一种创建对象的方式是否有效并且在ECMAScript标准中有定义?前一种创建对象的方式和后一种有什么区别?有没有一种比另一种更受偏爱?

0
0 Comments

问题:在使用"new"运算符创建对象时,我们可以省略括号吗?

原因:如果我们省略括号,在使用"new"运算符创建对象时会导致代码行为发生改变。具体来说,下面两行代码是不同的:

var someVar = myFunc; // 这将函数myFunc赋值给someVar
var someOtherVar = myFunc(); // 这将执行myFunc函数并将返回值赋值给someOtherVar

解决方法:为了避免出现上述问题,我们应该在使用"new"运算符创建对象时始终使用括号。这样可以确保我们创建的是一个对象实例,而不是将函数本身赋值给变量。例如:

var someVar = new myFunc(); // 使用括号创建myFunc的实例并将其赋值给someVar

如果我们习惯省略分号,这个问题就更加棘手了。为了避免出现意外的行为,我们应该养成良好的编码习惯,始终在适当的地方使用分号。

0
0 Comments

在使用"new"操作符创建对象时,是否可以省略括号?

问题的出现原因是因为"new Date()"和"new Date"具有不同的优先级。根据MDN的JavaScript操作符优先级表,我们关注的部分如下:

优先级18:

- 成员访问

- 计算成员访问

- new(带参数列表)

优先级17:

- 函数调用

- new(不带参数列表)

根据这个表格,可以得出以下结论:

1. "new Foo()"的优先级高于"new Foo"

2. "new Foo()"和"."操作符有相同的优先级

3. "new Foo"的优先级比"."操作符低一级

4. "new Date().toString()"正常工作,因为它被解析为"(new Date()).toString()"

5. "new Date.toString()"会抛出"TypeError: Date.toString is not a constructor",因为"."的优先级高于"new Date"(也高于"函数调用"),表达式被解析为"(new (Date.toString))()"

同样的逻辑也适用于"… [ … ]"操作符。

"new Foo"具有从右到左的结合性,而"new Foo()"的"结合性"不适用。在实践中,我认为这没有任何区别。

那么,是否有一种方法更好?根据以上内容,可以认为"new Foo()"更好。

总之,对问题进行了解答并指出了细微的差别!这个回答很棒。

了解了所有这些,可以认为"new Foo()"是首选。

最后,有人实际回答了问题并指出了微妙的差别!太棒了。

很好的解释,完全清楚地解释了优先级表和解释。很高兴你解释了为什么可以编写"new Object().something()"以及"(new Object()).something()"。

很好的解释,但我不同意结论,并且仍然认为在了解语言的情况下,不使用括号也是可以的。顺便说一下,如果你不了解JS的优先级,你也可以使用"(new Date).toString()",字符数相同,并且比"new Date().toString"更明确。

关于链式调用的解释回答了这个问题 - [stackoverflow.com/q/55545175/1828637](https://stackoverflow.com/q/55545175/1828637) - 谢谢。这也为这个问题增添了一些答案。

右到左的结合性使得"new new foo"解析为"new (new foo)"而不是"(new new) foo",这使得可以创建一个"function wat () { wat.counter = 1 + (wat.counter ? wat.counter : 0); return wat; }",来统计"wat"构造函数上使用的"new"的总数。你可以这样做"console.log(new new new new wat) // -> [Function: wat] {counter: 4}"...但是为什么要这样。

0
0 Comments

在使用"new"运算符创建对象时,我们是否可以省略括号?这个问题的出现是因为JavaScript在"new"运算符中允许省略括号,前提是没有参数传递给构造函数。个人而言,即使构造函数没有参数,我也总是使用括号。此外,如果省略括号,JSLint会报错,提示"Missing '()' invoking a constructor",而该工具似乎没有选项来容忍括号的省略。

JSLint鼓励使用括号的原因是什么?我想这只是考虑到了更加一致性。有趣的是,我发现许多JavaScript开发者之所以使用括号,只是因为"工具(JSLint)告诉他们应该这样做",尤其是考虑到那些在developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…上的示例,这些示例来自于"发明该语言的家伙们",在没有参数的构造函数中,并没有使用任何括号。如果这不说明问题的观点性,我不知道还有什么能说明了...

嗯,如果看不到语言的发明者展示他们语言的某些特性(在这种情况下是省略构造函数的括号),那将是奇怪的。如果他们没有添加这个特性,我们就不会首先问是否应该使用它。不使用括号的一个实际原因是这样的:`new Object.func()`与`new Object().func()`是不等价的。通过始终包括括号,消除了犯这个错误的可能性。

如果你想消除出错的可能性,你应该使用`(new Object).func()`。但我认为使用额外的括号和额外的等号,如`==`与`===`,是一个不学好你的语言的坏借口。

0