283 votes

Pourquoi n'y a-t-il pas de xor logique en JavaScript?

Pourquoi n'y a-t-il pas de xor logique en JavaScript?

441voto

John Kugelman Points 108754

JavaScript traces de son ascendance jusqu'à C, et C n'ont pas de logique opérateur XOR. Principalement parce qu'il n'est pas utile. XOR au niveau du bit est extrêmement utile, mais dans toutes mes années de programmation, je n'ai jamais eu besoin d'une logique XOR.

Si vous avez deux variables booléennes vous pouvez imiter XOR avec:

if (a != b)

Avec deux arbitraire de variables vous pouvez utiliser ! pour les forcer à valeurs booléennes et ensuite utiliser la même astuce:

if (!a != !b)

C'est assez obscur si et mériteraient certainement un commentaire. En effet, vous pourriez même utiliser l'opérateur XOR au niveau du bit à ce stade, bien que ce serait beaucoup trop intelligent pour mon goût:

if (!a ^ !b)

89voto

Pikrass Points 2671

Javascript a un opérateur XOR: ^

 var nb = 5^9 // = 12
 

C'est la même chose qu'en C. Je pense que c'est la norme, corrigez-moi si je me trompe.

33voto

Robert Points 1289

Il n'y a aucune logique réelle des opérateurs en Javascript. Un opérateur logique ne prendrait vrai ou faux comme argument et ne renvoie vrai ou faux.

En Javascript && et || prendre toutes sortes d'arguments et retourner toutes sortes de résultats.

a() && b() évalue a() et renvoie le résultat si c'est falsy. Sinon, il évalue b() et retourne le résultat. Par conséquent, le résultat renvoyé est truthy si les deux résultats sont truthy, et falsy autrement.

a() || b() évalue a() et renvoie le résultat si c'est truthy. Sinon, il évalue b() et retourne le résultat. Par conséquent, le résultat renvoyé est falsy si les deux résultats sont falsy, et truthy autrement.

L'idée générale est donc d'évaluer la gauche argument premier. Le bon argument obtient évalués uniquement si c'est nécessaire. Et le dernier résultat est retourné. Ce résultat peut être n'importe quoi. Des objets, des Nombres, des Chaînes .. que ce soit!

Cela permet d'écrire des choses comme

image = image || new Image();

ou

src = image && image.src;

Mais la valeur de vérité de ce résultat peut également être utilisé pour décider si un "vrai" opérateur logique aurait renvoyé true ou false.

Cela permet d'écrire des choses comme

if ("hasAttribute" in image && image.hasAttribute("src")) {

ou

if (image.hasAttribute("alt") || image.hasAttribute("title")) {

Mais une "logique" ^^ opérateur aurait à évaluer à la fois les arguments toujours. Ce qui le rend différent de l'autre "logique" des opérateurs qui permettent d'évaluer le deuxième argument que si nécessaire. Je pense que c'est pourquoi il n'y a pas de "logique" ou exclusif (xor) en Javascript.

De toute façon, qu'arriverait-il si les deux résultats sont truthy? Vous attendez quelque chose de falsy. Mais il n'y a pas falsy résultats. Si l'opération ne doit rien retourner.

Et enfin, ce qui devrait se produire si les deux résultats sont falsy? Les deux pourraient être retournés. Mais un seul peut être retourné. Lequel? Le premier? Ou le second? Mon intuition me dit de renvoyer le premier résultat, mais généralement de "logique", les opérateurs sont évaluées de gauche à droite et retour le dernier résultat évaluée.

12voto

The Surrican Points 12882

il est... en quelque sorte:

if( foo ? !bar : bar ) {
  ...
}

ou plus facile à lire:

if( ( foo && !bar ) || ( !foo && bar ) ) {
  ...
}

pourquoi? je ne sais pas.

parce que les développeurs javascript pensé qu'il serait inutile, car elle peut être exprimée par d'autres, déjà mis en œuvre, les opérateurs logiques.

vous pourriez tout aussi bien avoir gon avec nand et c'est tout, vous pouvez impressionner tous les autres logiques de fonctionnement.

personnellement, je pense qu'il a des raisons historiques qui conduisent à partir de c en fonction de la syntaxe des langues, où, à ma connaissance, xor n'est pas présent ou au moins exremely rare.

4voto

Mészáros Lajos Points 620

Que diriez-vous de transformer le résultat int en un bool avec double négation? Pas si joli, mais vraiment compact.

 var state1 = false,
    state2 = true;

var A = state1 ^ state2;     // will become 1
var B = !!(state1 ^ state2); // will become true
 

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