Pourquoi n'y a-t-il pas de xor logique en JavaScript?
Réponses
Trop de publicités?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)
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.
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.