web-dev-qa-db-fra.com

À moins que vs si en Javascript avec utilisation du point d'exclamation?

Le code ci-dessous tente d'imprimer "est pair" pour les nombres divisibles par 2.

Ne devrait-il pas être if (test) then () plutôt que: if (! Test) then (), lorsque la condition testée est "n% 2". Le code ci-dessous semble lire "SI les nombres ne sont PAS divisibles par 2, imprimez 'le nombre est pair'", ce qui ne semble pas logique.

Plus généralement, quels sont les avantages d'écrire une fonction Sauf par rapport à l'utilisation d'une instruction If pour spécifier une condition, alors que ce que nous pourrions faire est simplement d'écrire if (! Condition)?

Toute aide est très appréciée.

function unless(test, then) {
  if (!test) then();
}
function repeat(times, body) {
  for (var i = 0; i < times; i++) body(i);
}

repeat(5, function(n) {
  unless(n % 2, function() {
    console.log(n, "is even");
});
// → 0 is even
// → 2 is even
// → 4 is even
11
Henry

L'avantage discutable de ceci est que le code se lit un peu plus comme l'anglais: "A moins que n modulo 2 ne soit différent de zéro, connectez-vous à la console que n est pair."

D'après mon expérience, la conséquence pratique de cela est que la plupart des programmeurs devront vérifier ce que sauf si () le fait avant de se sentir à l'aise avec. Parce que ce n'est pas un morceau standard de Javascript, ils n'ont aucun moyen de savoir s'il l'utilise! ou == true ou === 0 ou un autre test toujours très différent, à moins qu'ils ne regardent l'implémentation.

Mon exemple préféré de ce principe est COBOL. Cette langue a essayé très fort de ressembler à l'anglais, de sorte que même les non-programmeurs pouvaient l'utiliser ... mais en réalité, les programmeurs et les non-programmeurs semblent détester travailler avec elle.

6
Ixrec

Il n'y a aucun avantage si la condition est fournie en ligne comme dans ce scénario. Vous pouvez facilement appliquer une transformation pour l'annuler comme il convient dans tous les cas (par exemple, en ajoutant un ! devant), et en supprimant unless de l'image signifie qu'il y a une chose de moins que le lecteur doit savoir.

Il pourrait être un avantage si la condition était fournie sous la forme d'un rappel, par exemple:

function test() { return true; }
function unless(test, then) { if (!test()) then(); }

unless(test, function() { console.log("test failed"); });

Dans cette situation, vous ne pouvez pas passer directement la négation de test à une fonction hypothétique onlyIf qui est complémentaire de unless, ayant donc à la fois onlyIf et unless peut rendre le code plus lisible car il vous permet de faire ceci:

onlyIf(test, function() { console.log("test passed"); });

au lieu de cela:

onlyIf(function() { return !test(); }, function() { console.log("test passed"); });

La situation ci-dessus pourrait être encore pire si le rappel est donné des arguments qui doivent être propagés dans test.

1
Jon