J'ai rencontré deux façons différentes de définir / nommer des objets et des fonctions dans JavaScript qui vérifient d'abord l'existence du nom avant de l'utiliser. Le problème est que je ne sais pas lequel est meilleur (de la vitesse et des points de vue de la vitesse et de la convivialité) et il est impossible d'utiliser les opérateurs booléens dans une recherche Google pour la comprendre.
Le premier que je vois le plus souvent: P>
var myNewObject = myNewObject || function() {
// Code goes here.
};
5 Réponses :
FWIW Je vois la deuxième approche plus souvent, et (pour ma part) Je pense que c'est plus clair, concis et plus idiomatique. P>
J'utiliserais le deuxième exemple, décrit comme (évaluation minimum). Son plus simple et semble plus lisible.
C'est comme obtenir un événement à partir de la méthode Onclick sur plusieurs navigateurs. P>
element.onclick = function (evt) {
evt = evt || window.event
}
Je choisirais ce dernier si seulement pour le fait que vous tapez En outre, tandis que la première définition est essentiellement un conditionnel à une ligne ... Qu'est-ce que le second appelé? P>
blockQuote>
myNewObject code> deux fois au lieu de trois fois. P>
Accepter cela comme réponse puisque vous m'avez également donné le nom de la deuxième approche. Cela aurait sauvé autant de temps, je sais ce qu'on appelle ... Je ne savais pas que c'était une approche légitime, juste qu'elle semblait travailler.
Ce dernier, c'est similaire em> à l'opérateur de coalesce null en C # voir: Existe-t-il un opérateur "NULL COALESSCING" dans JavaScript? p> ?? code> lorsqu'il est utilisé de cette manière p>
Notez que ce n'est pas complètement équivalent, ?? code> in c # Il retournera la valeur par défaut uniquement lorsque sa valeur d'opérande gauche est null code>, dans javascript || code > le fera quand son premier opérande est FALSY i>, les valeurs FALSY sont les suivantes: null code>, non défini code>, 0 code>, < Code> Nan code>, chaîne vide et FALSE code>.
@CMS, Ouais, d'où le lien pour la clarification. J'aurais dû écraser que c'est similaire i> au ?? code>
Les deux méthodes fonctionnent.
Mais je pense que la version la plus optimisée est de simplement utiliser un test normal si: faisant dans l'une quelconque de la méthode que vous suggère de votre réponse, cela pourrait impliquer une réaffectation inutile à chaque fois que la fonction / objet est déjà défini. Je veux dire si MyNewObject est déjà défini, l'exécution JavaScript devrait effectuer une réaffectation inutile sur le site Web de Mozilla Ils suggèrent d'utiliser un simple si, Voir ce . p> p> myNewObject = myNewObject = myNewObject code> (sauf si le temps d'exécution ne l'optimise pas). P>
Le second est plus courant, IMHO. Au moins pour les personnes connaissant la langue ...
Cool, est-ce que quelqu'un sait si cela fonctionne aussi avec le prototype: i.e. array.pototype.foreach = array.pototype.foreach || Fonction (... Je demande parce que sur le site Web de Mozilla, ils utilisent un tableau normal if (! Array.prototype.foreach ).Prototype.foreach = fonction (...
@Marco Demaio après la même logique est Devrait i> Travail. Je suggérerais de le gifler dans un script de test et de voir si cela le fait. Vous définissez toujours une méthode d'objet ... il se trouve déjà dans un espace de noms spécifique déjà.
Cela fonctionne, mais cela pourrait ne pas être optimisé. J'ai ajouté une réponse.