Question Javascript

Je suis en train de décrypter un code en javascript et je tombe parfois sur des lignes de ce style :
i > 0 && (i = Math.max(1, Math.floor(20 * i)));

Qu’est-ce que cela veut dire ? :crazy_face: Pourquoi une opération qui ne retourne pas de valeur est entre parenthèses ? De plus la condition n’est pas utilisée.

Ou est-ce que c’est juste l’équivalent de
if (i > 0) i = Math.max(1, Math.floor(20 * i));
?

It’s a trap!

Au hasard, une méthode bien crade de donner une valeur à i si i est supérieur à 0.
Mais sans contexte, c’est dur de savoir.

Réponse 2: sur un &&, la seconde partie n’est évaluée que si la première est vraie, donc c’est comme un if.

Quel est l’intérêt par rapport au if ? Une optimisation de code ? plus rapide à exécuter ?

Ecrire n’importe comment parce que tous passe en javascript? :smiley:

4 « J'aime »

On le voit en React pour conditionner un bout de template parce qu’on n’a pas accès aux structures de contrôle classiques:
{this.state.truc && <span className="bidule" />}

Mais je ne vois pas l’intérêt pour du js normal

1 « J'aime »

Argh que je hais ce style d’écriture. Je le vois souvent dans du script shell aussi :confused: .

Alors oui ça fonctionne, mais pour moi ça ne devrait même pas exister. Ok c’est une astuce, et un moyen purement pratique de se servir des spécificité des langages/compilateur, mais justement je trouve que c’est trop dépendant du compilateur ou de l’interpréteur et que ça casse complètement « l’universalité de la logique booléenne » (désolé je vois pas comment l’exprimer autrement).

(A && B) : on est d’accord qu’il est inutile, en pratique, de tester B si A est faux. En théorie aussi d’ailleurs. Mais alors quelle règle logique stipule qu’il ne faudrait pas plutôt tester B en premier, et ne pas évaluer A si B est faux ? D’ailleurs il me semble que certains compilateur fonctionnent dans ce sens.

Normalement (A && B) == (B && A) mais avec ces utilisations il devient impossible de changer l’ordre des expression, ce que je trouve anormal.

Et accessoirement ça empêche d’écrire des trucs du style ((++A<10) && (++B<10)) si les valeurs de A et B après le test doivent être utilisées (bon ok cça peut être assez moche comme écriture mais tout à fait valable à mon sens).

Voilà voilà :sweat_smile:

1 « J'aime »

Oui mais c’est quand même bien pratique d’avoir un ordre d’évaluation déterministe quand tu veux vérifier la nullité d’une référence avant de l’utiliser:

if(truc != null && truc.equals(bidule)){
...
}

On n’a pas la même notion du « valable ». :smile:

Suffit de faire deux tests :stuck_out_tongue: . Mais certes ça peut être pratique.

Valable dans la logique, ça n’empêche pas d’être moche :smiley:

1 « J'aime »

La syntaxe A && B remplace un algo de type “faire A, et si A réussit alors faire aussi B”. C’est plus synthétique que de l’écrire avec un “if”, mais ce n’est pas pour rien… En toute rigueur, c’est écrire un “if” sans “else” qui est un peu crado…

retour = faire A
si (retour OK)
alors
  faire B
fin de si

c’est quand même beaucoup plus tordu que

faire A et en cas de succès faire B aussi

Ok, vu comme ça, ça a plus de sens effectivement.

Mais je ne vois absolument aucun problème à faire un if sans else par contre, et je trouve toujours ça plus tordu et moins « carré » :p.

1 « J'aime »

Pour être honnête c’est surtout une question d’esthétique. C’est un peu comme l’opérateur ternaire vraiOuFaux ? siVrai : siFaux. Quand c’est utilisé pour les bonnes choses, et que c’est utilisé de manière consistante à travers tout un projet, ça rend le code plus facile à lire (le cerveau finit par repérer ces “motifs”).

C’est comme les goto. Les gens sont partis d’une règle générale et d’une bonne pratique “attention, ça ne s’utilise pas n’importe comment sinon ça fait du code déstructuré”, pour en faire une espèce de commandement religieux “c’est tabou si tu en utilises tu es un hérétique !”. Sauf que, quand tu as déjà fait de l’assembleur, et que tu fais du C par exemple, l’usage du goto peut rendre le code plus parlant (en ramenant tous les cas d’erreurs en fin de fonction par exemple, pour tous les avoir sous les yeux au même endroit). C’est ce que pas mal de gens du noyau Linux font.

Et encore je ne parle pas du choix entre tabulations et X espaces pour indenter, et des sous-religions qui font varier X entre 2 et 8… Tout ça pour tenir parfois en 80 colonnes sur des écrans 30 pouces en 4K ^^

En parlant d’opérateur ternaire, j’en ai trouvé 4 imbriqués sur une ligne (et combiné avec des && :smiley: ) . Je crois que je suis tombé sur un codeur qui fait tout pour optimiser la place… (et qui rend tout illisible sur une ligne)

1 « J'aime »

Pour ma part, je fais souvent ça en shell :slight_smile:

2 « J'aime »

Écrire ce genre de code ça en rend souvent illisible le code et la compréhension de l’algo, on dirait que c’est pour se la péter. La seule utilité c’est effectivement dans les shells.

Pour apporter ma pierre bullshitesque à l’édifice : tout peut être écrit du moment que c’est utile et consistant ET que c’est commenté / documenté… :wink:

2 « J'aime »