33 votes

Javascript: || au lieu de déclaration IF - ce navigateur légal et croisé est-il valide?

Il paraît que:

 if (typeof a == 'undefined') {
    a = 0;
}
 

et

 (typeof a != 'undefined') || (a = 0)
 

a le même effet en Javascript.

J'aime beaucoup le second parce qu’il est court, le code d’une ligne, mais est-ce légal et valable pour tous les navigateurs? Je veux dire, Jslint dit qu'il a des erreurs. Devrais-je l'utiliser sans soucis?

76voto

Tomasz Nurkiewicz Points 140462

À mon humble avis, || (a = 0) est trop semblable à l' || (a == 0) et donc source de confusion. Un jour, les excès de zèle développeur vient de "fix it", en changeant le sens de votre code. Et tous les autres développeurs auront à s'asseoir pendant un certain temps à comprendre que c'était votre intention, ou juste un simple bug.

Et c'est en fait ce que JSLint est en train de dire:

Attend une expression conditionnelle et a plutôt connu une mission.

- Je éviter d'utiliser confusion constructions que ceux-ci nuisent à la lisibilité. a = a || 0; , c'est bien plus reconnaissables et les plus similaires dans ce sens.

31voto

Norguard Points 10718

Pourquoi pas quelque chose de plus simple, comme:

a = a || 0;

ou

a = a ? a : 0;

Dans ces deux cas, vous pouvez clairement voir que quelque chose est en train d'être affecté a, au début de la ligne, sans avoir recours à la lecture de toute chose, et de déterminer s'il y a un jeu de changement de la fonction des appels qui se passe sur la gauche ou de droite... ou à comprendre ce que les deux côtés ne, en général, de décider comment beaucoup de potentiel de l'ensemble du programme des modifications qu'il pourrait y être.

Si vous avez besoin d'inclure l'ensemble de la type-vérifier, c'est tout de même pas que les grands.

a = (typeof a !== "undefined") ? a : 0;  // [parentheses are there for clarity]

9voto

Bergi Points 104242

est-ce légal, et de la croix-navigateur valide?

Oui, il fonctionne dans tous les EcmaScript moteurs. Cependant, il est très rare de (ab)court-circuit-l'évaluation comme un if.

Je veux dire, jslint dit qu'il a des erreurs. Devrais-je l'utiliser sans soucis?

Non, JsLint est droit. Il est inhabituel et déroutant, au moins pour les autres développeurs. Cela ressemble trop à un OU condition, mais n'a pas de "corps". Et si vous ne les affectations, la variable est prévue pour le début de l'instruction, et non pas à l'intérieur d'une expression.

J'aime vraiment le second parce qu'il est court, une seule ligne de code

Ensuite, utilisez

if (typeof a == 'undefined') a = 0;

2voto

Rahul Points 239

Vous pouvez utiliser:

 a = typeof(a) !== "undefined" ? a : 0; 
 

1voto

Phil H Points 10133

Stylistiquement, la définition de valeurs par défaut telles que a || a=default est un idiome courant lors de l’entrée dans une fonction, car javascript n’impose pas le nombre d’arguments.

La lisibilité sera compromise si cette construction est utilisée dans d'autres circonstances, où vous voulez vraiment dire si / sinon.

Auparavant, les performances variaient selon les styles, mais dans un test rapide aujourd'hui, si / else et les opérateurs logiques avaient la même vitesse, mais le fonctionnement ternaire était plus lent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X