首页 > 解决方案 > javascript中的链接运算符如何工作?

问题描述

我正在寻找 XOR 三个布尔变量。只有一个可以是真的,一个必须是真的:

function isValid(a, b, c) { return a !== b !== c; }

var one = false;
var two = false;
var three = true;

console.log(isValid(one, two, three)); // should be true  

one = true;
console.log(isValid(one, two, three)); // should be false

这个解决方案似乎有效,但我的问题是......为什么?如果所有值都是假的,它不应该失败吗?

var one = false;
var two = false;
var three = false;
console.log(isValid(one, two, three)); // should be true, but it is false

此外,所有变量为真,当它应该返回假时返回真。

var one = true;
var two = true;
var three = true;
console.log(isValid(one, two, three)); // should be false, but it's true

我的想法是它是这样执行的:

a    !== b?  TRUE
TRUE !== c?  TRUE

显然这不是它的工作原理,那么它是如何工作的呢?

标签: javascript

解决方案


这个解决方案似乎有效,但我的问题是......为什么?

不适用于您所描述的(只有一个可以是真的,一个必须是真的);在这种情况下失败true, true, true

function isValid(a, b, c) { return a !== b !== c; }

console.log(isValid(true, true, true)); // true, should be false

我应该注意,我不认为您的规则与 XOR 完全相同,因为true XOR true XOR trueis true(因为true XOR trueisfalsefalse XOR trueis true)。

a !== b !== c评估如下:

  • a !== b被评估并产生boolean结果,true如果条件为真或false为假。叫那个r。在这种true, true, true情况下,true !== truefalse这样的r = false
  • r !== c被评估并产生它的boolean结果。在这种true, true, true情况下,false !== truetrue

从上面可以看出,它几乎适用于所有 XOR 情况,但不是当所有输入都是true. 它也不适用于其他示例。人们最常犯的错误可能是试图查看 、 和 是否ab具有c相同的值:

if (a === b === c) // WRONG (almost always)

既然那((a === b) === c)(some_boolean === c),它几乎总是错误的(例如,如果ab,并且c包含除boolean值之外的任何内容)。


推荐阅读