7
votes

Conditionnels de définition d'objet javascript - ce qui est meilleur?

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.
};


4 commentaires

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 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.


5 Réponses :


1
votes

FWIW Je vois la deuxième approche plus souvent, et (pour ma part) Je pense que c'est plus clair, concis et plus idiomatique.


0 commentaires

5
votes

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
}


0 commentaires

5
votes

Je choisirais ce dernier si seulement pour le fait que vous tapez myNewObject deux fois au lieu de trois fois.

En outre, tandis que la première définition est essentiellement un conditionnel à une ligne ... Qu'est-ce que le second appelé?

évaluation de court-circuit


1 commentaires

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.



2
votes

Ce dernier, c'est similaire à l'opérateur de coalesce null en C # ?? lorsqu'il est utilisé de cette manière

voir: Existe-t-il un opérateur "NULL COALESSCING" dans JavaScript?


2 commentaires

Notez que ce n'est pas complètement équivalent, ?? in c # Il retournera la valeur par défaut uniquement lorsque sa valeur d'opérande gauche est null , dans javascript || le fera quand son premier opérande est FALSY , les valeurs FALSY sont les suivantes: null , non défini , 0 , < Code> Nan , chaîne vide et FALSE .


@CMS, Ouais, d'où le lien pour la clarification. J'aurais dû écraser que c'est similaire au ??



0
votes

Les deux méthodes fonctionnent. Mais je pense que la version la plus optimisée est de simplement utiliser un test normal si: xxx

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 myNewObject = myNewObject = myNewObject (sauf si le temps d'exécution ne l'optimise pas).

sur le site Web de Mozilla Ils suggèrent d'utiliser un simple si, Voir ce .


0 commentaires