Peut-on omettre les parenthèses lors de la création d'un objet à l'aide de l'opérateur “new”?
J'ai vu des objets créés de cette façon:
const obj = new Foo;
Mais je pensais que les parenthèses ne sont pas en option lors de la création d'un objet:
const obj = new Foo();
Est l'ancienne façon de créer des objets valides et définis dans le standard ECMAScript? Existe-il des différences entre l'ancien chemin de la création d'objets et le plus tard? Est un privilégié par rapport à l'autre?
- ecma-international.org/ecma-262/5.1/#sec-11.2.2
- Mise à jour de référence: ECMAScript 2017 §12.3.3 La nouvelle Opertator.
Vous devez vous connecter pour publier un commentaire.
Citant David Flanagan1:
Personnellement, j'ai toujours utiliser les parenthèses, même si le constructeur ne prend pas d'arguments.
En outre, JSLint peut blesser vos sentiments si vous omettez de la parenthèse. Il signale
Missing '()' invoking a constructor
, et il ne semble pas être une option pour l'outil de tolérer la parenthèse de l'omission.1 David Flanagan: JavaScript le Guide Définitif: 4ème Édition (page 75)
new Class
sans paramètre pour les constructeurs. Si ce n'est pas 'sort d'opinions", je ne sais pas quoi...new Object.func()
n'est PAS équivalent ànew Object().func()
. Par toujours, y compris, entre parenthèses, la possibilité de faire cette erreur est éliminée.(new Object).func()
. Mais je envisager d'utiliser parenthèse supplémentaires et extra signes égal, comme dans==
vs===
, une mauvaise excuse pour ne pas l'apprentissage de votre langue.()
moyens d'appel de la fonction, en omettant()
signifie simplement obtenir une référence.(new Date).getDay()
?Il y a des différences entre les deux:
new Date().toString()
fonctionne parfaitement et retourne la date actuellenew Date.toString()
jette "TypeError: Date.toString n'est pas un constructeur"Cela se produit parce que
new Date()
etnew Date
ont différentes priorité. Selon MDN la partie de JavaScript la priorité de l'opérateur tableau qui nous intéresse ressemble:À partir de ce tableau qui suit:
new Foo()
a une priorité plus élevée quenew Foo
new Foo()
a la même priorité que.
opérateurnew Foo
a un niveau de priorité plus basse que la.
opérateurnew Date().toString()
fonctionne parfaitement, parce qu'il évalue comme(new Date()).toString()
new Date.toString()
jette "TypeError: Date.toString n'est pas un constructeur" parce que.
a une priorité plus élevée quenew Date
(et plus, alors, la Fonction "Appel") et l'expression est évaluée comme(new (Date.toString))()
La même logique peut être appliquée à
… [ … ]
de l'opérateur.new Foo
a de droite à gauche l'associativité et pournew Foo()
"associativité" n'est pas applicable. Je pense que, dans la pratique, cela ne fait aucune différence. Pour plus d'informations, voir cette DONC, la questionSachant tout cela, on peut supposer que
new Foo()
est préféré.new Foo()
doit être préférée à l'new Foo
. La meilleure réponse à ce jour.new Object().something()
ainsi que(new Object()).something()
.(new Date).toString()
, même nombre de caractères, et plus explicite quenew Date().toString
.Je ne pense pas qu'il y a une différence lorsque vous utilisez l'opérateur "new". Soyez prudent au sujet d'entrer dans cette habitude, que ces deux lignes de code ne sont PAS les mêmes:
Si vous n'avez pas d'arguments à transmettre, les parenthèses sont facultatives. L'omission est tout simplement sucre syntaxique.
https://people.mozilla.org/~jorendorff/es6-projet.html#sec-nouvelle-opérateur-runtime-sémantique-évaluation
Voici la partie de l'ES6 spécification qui définit la façon dont les deux variantes de fonctionner. L'absence de parenthèses variante passe un argument vide de la liste.
Fait intéressant, les deux formes ont différentes significations grammaticales. Cela arrive lorsque vous essayez d'accéder à un membre du résultat.
Il n'y a pas de différence entre les deux.