Je lis este question sur l'"opérateur virgule" dans les expressions ( ,
) et le Documents MDN à ce sujet, mais je ne peux pas penser à un scénario où il est utile.
Alors, quand l'opérateur virgule est-il utile ?
Je lis este question sur l'"opérateur virgule" dans les expressions ( ,
) et le Documents MDN à ce sujet, mais je ne peux pas penser à un scénario où il est utile.
Alors, quand l'opérateur virgule est-il utile ?
Je ne suis pas d'accord avec Flanagan, et je dirais que la virgule est vraiment utile et permet d'écrire un code plus lisible et plus élégant, surtout quand on sait ce que l'on fait :
Voici le article très détaillé sur l'utilisation des virgules :
Plusieurs exemples en sont issus pour la preuve de la démonstration :
function renderCurve() {
for(var a = 1, b = 10; a*b; a++, b--) {
console.log(new Array(a*b).join('*'));
}
}
Un générateur de fibonacci :
for (
var i=2, r=[0,1];
i<15;
r.push(r[i-1] + r[i-2]), i++
);
// 0,1,1,2,3,5,8,13,21,34,55,89,144,233,377
Trouver le premier élément parent, analogue de jQuery .parent()
fonction :
function firstAncestor(el, tagName) {
while(el = el.parentNode, el && (el.tagName != tagName.toUpperCase()));
return el;
}
//element in http://ecma262-5.com/ELS5_HTML.htm
var a = $('Section_15.1.1.2');
firstAncestor(a, 'div'); //<div class="page">
J'ai trouvé l'opérateur virgule très utile pour écrire des aides comme celle-ci.
const stopPropagation = event => (event.stopPropagation(), event);
const preventDefault = event => (event.preventDefault(), event);
const both = compose(stopPropagation, preventDefault);
Vous pourriez remplacer la virgule par un || ou un &&, mais vous devriez alors savoir ce que la fonction renvoie.
Plus important que ça, le séparateur de virgule communique intention -- le code ne se soucie pas ce que l'opérande de gauche évalue, alors que les alternatives peuvent avoir une autre raison d'être là. Cela facilite la compréhension et le remaniement. Si le type de retour de la fonction change, le code ci-dessus ne sera pas affecté.
Naturellement, vous pouvez obtenir la même chose par d'autres moyens, mais pas de manière aussi succincte. Si || et && ont trouvé une place dans l'usage courant, il en va de même pour l'opérateur virgule.
Je n'en ai pas trouvé d'autre utilisation pratique, mais voici un scénario dans lequel James Padolsey utilise joliment cette technique de détection des IE en boucle :
var ie = (function(){
var undef,
v = 3,
div = document.createElement('div'),
all = div.getElementsByTagName('i');
while ( // <-- notice no while body here
div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
all[0]
);
return v > 4 ? v : undef;
}());
Ces deux lignes doivent être exécutées :
div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
all[0]
Et à l'intérieur de l'opérateur virgule, les deux sont évalués alors qu'on aurait pu en faire des déclarations séparées d'une manière ou d'une autre.
Il y a quelque chose de "bizarre" qui peut être fait en JavaScript en appelant une fonction indirectement en utilisant l'opérateur virgule.
Il y a une longue description ici : Appel indirect de fonction en JavaScript
En utilisant cette syntaxe :
(function() {
"use strict";
var global = (function () { return this || (1,eval)("this"); })();
console.log('Global === window should be true: ', global === window);
var not_global = (function () { return this })();
console.log('not_global === window should be false: ', not_global === window);
}());
Vous pouvez accéder à la variable globale car eval
fonctionne différemment selon qu'il est appelé directement ou indirectement.
Un cas typique où je l'utilise est celui de l'analyse des arguments optionnels. Je pense que cela rend la fonction à la fois plus lisible et plus concise, de sorte que l'analyse des arguments ne domine pas le corps de la fonction.
/**
* @param {string} [str]
* @param {object} [obj]
* @param {Date} [date]
*/
function f(str, obj, date) {
// handle optional arguments
if (typeof str !== "string") date = obj, obj = str, str = "default";
if (obj instanceof Date) date = obj, obj = {};
if (!(date instanceof Date)) date = new Date();
// ...
}
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.
2 votes
var i, j, k;
vsvar i; var j, var k
?22 votes
@SalmanA. Je ne suis pas sûr que ça ait quelque chose à voir avec la
,
opérateur. Cette ligne est valable dansC#
également, mais le,
L'opérateur n'existe pas là-bas.0 votes
Le site
,
n'existe pas en C# ? Vous devez faire des recherches.2 votes
@SalmanA. Je l'ai fait. Je ne l'ai pas trouvé, éclaire-moi...
6 votes
@SalmanA a
,
n'est pas toujours le,
(et ce n'est jamais l'opérateur,
en C#). Ainsi, le C# peut manquer d'un,
tout en utilisant librement,
dans le cadre de la syntaxe.0 votes
Vous avez tous les deux raison. J'ai posté une nouvelle réponse spécifique à JavaScript.
9 votes
Je pense que les réponses ici ont résumé le fait que la
,
n'est pas largement utilisé (et non pas chaque occurrence d'un,
est l'opérateur virgule) . Mais vous pouvez l'emprunter ainsi qu'un tableau pour effectuer un échange de variables en ligne sans créer de variable temporaire. Étant donné que vous voulez échanger les valeurs dea
etb
vous pouvez fairea = [b][b = a,0]
. Cela place l'actuelb
dans le tableau. Le deuxième[]
est la notation d'accès aux propriétés. L'indice auquel on accède est0
mais pas avant d'avoir assignéa
ab
qui est maintenant en sécurité depuisb
est conservé dans le tableau.,
nous permet de faire les expressions multiples dans le[]
.1 votes
...bien qu'il existe des moyens d'y parvenir sans la
,
comme...a = {b:b, a:b=a}['b']
ou comme ça...a = [b, b=a][0]
0 votes
@amnotiam. encore des commentaires... Pouvez-vous ajouter un violon ?
1 votes
Oui, je n'ai vraiment pas grand chose à ajouter aux réponses existantes. Voici un violon montrant les 3 échanges. Le premier utilise le
,
mais là encore, il est possible de s'en passer comme le montrent les deux autres.0 votes
...une chose que le
,
permet d'éviter l'affectation non utilisée à l'objet ou au tableau. Il s'agit d'une micro-optimisation, mais elle peut être importante pour quelqu'un.