99 votes

Que fait une virgule dans les expressions JavaScript ?

Si j'utilise :

1.09 * 1; // returns "1.09"

Mais si j'utilise :

1,09 * 1; // returns "9"

Je sais que 1 09 n'est pas un nombre.

Que fait la virgule dans le dernier morceau de code ?

Autres exemples

if (0,9) alert("ok"); // alert
if (9,0) alert("ok"); // don't alert

alert(1); alert(2); alert(3); // 3 alerts
alert(1), alert(2), alert(3); // 3 alerts too

alert("2",
    foo = function (param) {
        alert(param)
    },
    foo('1')
)
foo('3'); // alerts 1, 2 and 3

3 votes

Je suis surpris que le 09 n'échoue pas en raison d'un '9' illégal dans l'alphabet octal.

9 votes

@recursive - tout 9 dans la représentation octale entraîne un retour en décimal.

0 votes

Ne confondez pas la virgule avec une liste d'arguments. alert ne prend qu'un seul argument. Tout ce qui suit est écarté.

102voto

Yuval Adam Points 59423

L'opérateur virgule évalue les deux de ses opérandes (de gauche à droite) et renvoie la valeur du deuxième opérande.

Fuente: https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special_Operators/Comma_Operator

Par exemple, l'expression 1,2,3,4,5 évalue à 5 . De toute évidence, l'opérateur virgule n'est utile que pour les opérations ayant des effets secondaires.

console.log(1,2,3,4,5);
console.log((1,2,3,4,5));

3 votes

Ils l'ont pris à C. Je pense que c'est seulement utile pour les expressions qui ont des effets secondaires.

4 votes

Je ne vois pas beaucoup de cas où l'opérateur virgule est utilisé à d'autres fins que de sauver des caractères (minification) ou d'obscurcir le code.

2 votes

@user17753 il peut être utilisé légitimement dans la section séparée par un point-virgule d'une for bucle.

6voto

Douglas Points 10417

D'autres éléments à prendre en compte :

console.log((0, 9));
console.log((9, 0));
console.log(("foo", "bar"));

7 votes

Lol, c'est amusant : alert("1", alert("2", alert("3")))

1 votes

@Andrew : Oups, j'ai mis à jour ma réponse avec ce que je voulais utiliser.

0 votes

L'opérateur virgule évalue chacun de ses opérandes (de gauche à droite) et renvoie la valeur de l'opérande. last opérande.

3voto

xgqfrms Points 2718

L'opérateur virgule évalue les deux de ses opérandes (de gauche à droite) et renvoie la valeur de la second opérande.

https://stackoverflow.com/a/3561056/5934465

Ça devrait être comme ça !

L'opérateur virgule évalue chacun de ses opérandes (de gauche à droite) et renvoie la valeur de l'opérande. last opérande.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator

0voto

CPHPython Points 2219

Ajouter/modifier des propriétés à un objet et le renvoyer dans la même ligne est un cas d'utilisation possible :

console.log(
  ((x) => (o = {biggerCond: r => r >= x},
           o.r5 = Array.from(window.crypto.getRandomValues(new Uint16Array(5))),
           o.isAnyBigger = o.r5.some(o.biggerCond),
           o.bigger = o.isAnyBigger ? o.r5.filter(o.biggerCond) : [x], o )
  )(5e4)
);
// Example
// {
//   bigger: [58414, 56500, 63397],
//   isAnyBigger: true,
//   isBiggerCond: r => r >= x,
//   r5: [58414, 12015, 56500, 63397, 43861]
// }

La fonction anonyme ci-dessus renvoie un objet avec des valeurs aléatoires plus grandes que la valeur d'entrée ou, s'il n'y en a pas, avec la valeur d'entrée elle-même dans un tableau contenu dans le fichier bigger propriété.

Il s'agit encore de sucre syntaxique (comme le fonctions de la flèche ), mais cela permet de réduire le nombre de lignes... Je me demande si certains minifieurs JS détectent et ajustent le code de manière similaire automatiquement. Exécutez-le dans votre console :

((x)=>(o={biggerCond:r=>r>=x},o.r5=Array.from(window.crypto.getRandomValues(new Uint16Array(5))),o.isAnyBigger=o.r5.some(o.biggerCond),o.bigger=o.isAnyBigger?o.r5.filter(o.biggerCond):[x],o))(5e4)

0voto

Marinos An Points 98

La syntaxe spécifique vous permet de cuire du pain et le remettre au client pour qu'il le consomme sans aucune return s.

(new Array(3)).fill()
.map(()=>({state:"dough", bake(){this.state="baked"}, consume(){this.state="consumed"}}))

.map(bread=>(console.log(`Adding ${bread.state} to oven.`), bread.bake(), bread))
.map(bread=>(console.log(`Consuming ${bread.state} bread.`), bread.consume(), bread))
.map(bread=>console.log(`Bread is now ${bread.state}.`))

Adding dough to oven.
Adding dough to oven.
Adding dough to oven.
Consuming baked bread.
Consuming baked bread.
Consuming baked bread.
Bread is now consumed.
Bread is now consumed.
Bread is now consumed.

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