35 votes

Assignation de variable dans une condition "if" en JavaScript

Comment le code ci-dessous s'exécute-t-il ?

if(a=2 && (b=8))
{
    console.log(a)
}

SORTIE

a=8

8 votes

Pourquoi mettre b=8 dans les parenthèses mais pas a=2 ? On dirait presque qu'il s'agit d'une tentative de trolling.

0 votes

Quand vous avez vu b= pourquoi n'avez-vous pas pris la peine de vérifier la valeur de b ? Cela aurait donné suffisamment d'indices...

0 votes

@NiklasB. Si je ne mets pas b=8 entre parenthèses, j'obtiens une erreur parce qu'il exécute quelque chose comme a = (2 && b=8). Je ne comprends pas bien cette erreur, mais la raison pour laquelle il faut mettre b=8 entre parenthèses est qu'il faut donner une priorité élevée à b=8 ou vous pouvez simplement dire, pour éviter les erreurs.

43voto

adeneo Points 135949

Cela n'a rien à voir avec le if déclaration, mais :

if(a=2 && (b=8))

Voici le dernier, (b=8) renvoie en fait 8, car l'assignation renvoie toujours la valeur assignée, ce qui revient à écrire

a = 2 && 8;

Et 2 && 8 renvoie à 8 comme 2 est véridique, donc c'est la même chose que d'écrire a = 8 .

0 votes

Parfait. Merci beaucoup pour cette belle explication.

4 votes

Avec l'effet secondaire que b sera aussi 8, bien sûr.

0 votes

@CompuChip - Yep, l'assignation assigne 8 a b mais l'assignation renvoie également la valeur assignée, donc c'est correct.

19voto

Anthony Grist Points 25966

C'est généralement une mauvaise idée d'assigner des variables à l'intérieur d'un fichier de type if comme cela. Cependant, dans ce cas particulier, vous faites essentiellement ceci :

if(a = (2 && (b = 8)));

El (b = 8) retours de pièces 8 donc on peut le réécrire comme suit :

if(a = (2 && 8))

El && L'opérateur renvoie la valeur de la partie droite si la partie gauche est considérée comme vraie, donc 2 && 8 renvoie à 8 donc on peut réécrire comme suit :

if(a = 8)

0 votes

Est-ce parce que tout ce qui est supérieur à 0 est considéré comme vrai ?

0 votes

@staticx Tout entier non nul (donc positif) o négatif) est considéré comme vrai lorsqu'il est converti en booléen.

8voto

user1153551 Points 3562

Il s'appelle la préséance des opérateurs

(a=2 && (b=8))

Dans le exemple ci-dessus . puis les résultats sont évalués par rapport au signe principal &&.

(a=2 && (b=8)) evaluated to a = 2 && 8

Alors 2 && 8 retourner a = 8

5voto

nmaier Points 14425

Vous êtes en train de fixer (et non de comparer) a a 2 && (b=8) . Puisque 2 est vrai, la seconde moitié de l'expression sera exécutée, c'est-à-dire que a = true && (b = 8) c'est-à-dire a = (b = 8) c'est-à-dire a = 8 .

5voto

Fizer Khan Points 4128

Votre déclaration est interprétée comme

a = (2 && (b=8))

quand vous utilisez && alors la valeur de la dernière déclaration vraie sera retournée. Ici (b=8) deviendra la valeur 8 ce qui est vrai et la dernière déclaration.

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