2014-04-21 1 views
4

Je trouve l'extrait suivant en creusant à travers un code:En utilisant && comme remplacement pour instruction IF

"string" != typeof myVar && (myVar = ""); 

Je comprends ce qui se passe ici. Si myVar n'est pas une chaîne, cette première condition est évaluée à "true", donc la seconde condition est évaluée, ce qui amène myVar à "". Il est donc essentiellement un remplacement pour les éléments suivants:

if ("string" != typeof myVar) 
    myVar = ""; 

La seule différence notable est que le premier des deux stratégies est également une déclaration de retour, bien que le code que je trouve n'utilise pas la valeur retournée. Donc, je me demande:

  1. Y a-t-il des avantages ou des inconvénients à l'une ou l'autre stratégie?
  2. Si le seul pro de la première stratégie est la capacité à renvoyer une valeur, l'extrait que j'ai trouvé est-il considéré comme étant de mauvaise qualité, car il est plus difficile à lire?
+6

Je pense que le plus gros problème est la lisibilité. Il est beaucoup plus facile de regarder la déclaration if et de comprendre ce qui se passe. –

+1

Si vous aimez Star Wars, le code de Yoda est toujours génial, mettre la chaîne devant le contrôle de typeof devant l'assignemnt etc. – adeneo

+0

Je pense toujours à [KISS] (http://en.wikipedia.org/wiki/ KISS_principle). –

Répondre

2

Je veux juste souligner qu'il existe des utilisations moins claires de cet idiome et plus clair. J'ai lu ceci et j'ai dû le convertir en if/else dans ma tête. Steve McConnell a soutenu qu'il devrait y avoir une ligne de code par travail, avec laquelle j'ai tendance à être d'accord et que cela constitue une violation absurde. Notez également que les effets secondaires intégrés sont risqués en premier lieu, c'est assez flagrant.

parameters = parameters || {}; 
var speed = parameters.speed || 60; 

est une utilisation beaucoup plus claire, en partie parce que c'est un idiome bien établi. ou

if(x && x.employer && x.employer.company === 'google') 

est une utilisation claire de l'idiome (vous aurez une exception si vous faites undefined.company, par exemple).

Questions connexes