14

Lors du débogage de javascript écrit par quelqu'un d'autre, je suis tombé sur du code que je n'avais jamais vu auparavant. Voici un exemple:Technique de codage JavaScript ou mauvais code?

function doSomething() { 
    //doing something here... 
} 

function doItNow() { 
    //other logic... 
    doSomething && doSomething(); // <=== What's this? 
} 

est le but de la 2ème ligne en fonction doItNow() pour vérifier si existe doSomething puis l'appeler? Comme:

function doItNow() { 
    //other logic... 
    if (doSomething) { 
     doSomething(); 
    } 
} 

JSLint ne l'aime pas et je préfère ne pas avoir de mauvais code dans mon application. Des idées?

+0

Je pense que c'est assez intelligent bien que cela nuise à la lisibilité du code. Je ne qualifierais pas ce "mauvais code" de "code avec une mauvaise lisibilité" –

+0

Selon la langue, cela peut être considéré comme un idiome standard. –

Répondre

7

C'est en fait un raccourci. Le côté droit n'est exécuté que lorsque le côté gauche passe comme instruction if().

Google Le compilateur de fermeture et d'autres minifieurs en profitent; si votre entrée est if(a) a(), elle se traduira par a&&a()


Vous pouvez faire la même chose avec ||, par exemple:

if(!a){ 
    alert('Not a'); 
} 

peut être écrit comme

a || alert('Not a'); 
+0

Merci, c'était ma conjecture. – Silkster

6

Oui, deux exemples sont "équivalents", l'opérateur && exécute short-circuit evaluation.

Si la première expression d'opérande donne une Falsey valeur (comme null, undefined, 0, NaN, une chaîne vide, et bien sûr false), la deuxième expression opérande ne évaluer, et si la la valeur est truey, l'appel de fonction sera effectué. Mais si doSomething n'a pas été déclaré, vos deux exemples échoueront.

Si un identifiant qui est non déclaré, est référencé sur le code, vous obtiendrez une exception ReferenceError, par exemple:

function foo() { 
    undeclared && undeclared(); 
} 

try { 
    foo(); 
} catch (e) { 
    alert(e); // ReferenceError! 
} 

Si vous voulez:

  1. Assurez-vous que l'identifiant existe, et
  2. Assurez-vous qu'il est appelable

Vous pouvez:

if (typeof doSomething == 'function') { 
    doSomething(); 
} 

Le typeof operator peut être utilisé en toute sécurité sur les identificateurs qui n'existent pas, en outre, en vérifiant que doSomething est une fonction, vous assurez-vous que vous serez en mesure de l'invoquer.

+0

+1. Ceci est une réponse plus complète que celle acceptée. –

+0

@Tim: Merci! :) – CMS

+0

@CMS, merci pour la réponse. – Silkster

1

L'appel de fonctions (ou affectations, etc.) dans des comparaisons est généralement une mauvaise idée. Les gens ne s'attendent généralement pas à ce que les comparaisons aient des effets secondaires.Ce cas est assez simple pour être justifié, mais si quelqu'un ne comprend pas la convention, il se peut qu'il doive demander sur StackOverflow;)

Questions connexes