javascript中的链接运算符如何工作?

Jef*_*eff 1 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
Run Code Online (Sandbox Code Playgroud)

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

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

此外,所有变量均为true,应返回false时返回true。

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

我的想法是这样执行:

a    !== b?  TRUE
TRUE !== c?  TRUE
Run Code Online (Sandbox Code Playgroud)

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

T.J*_*der 6

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

它对您描述的内容无效(只有一个可以为真,而一个必须为真);在以下true, true, true情况下失败:

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

console.log(isValid(true, true, true)); // true, should be false
Run Code Online (Sandbox Code Playgroud)

我应该注意,我认为您的规则与XOR不太相同,因为true XOR true XOR truetrue(因为true XOR truefalse,并且false XOR truetrue)。

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

  • a !== b条件为true或false时booleantrue将对结果进行评估并产生结果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)
Run Code Online (Sandbox Code Playgroud)

因为这((a === b) === c)(some_boolean === c),它几乎总是错的(例如,如果ab以及c含有什么,但boolean值)。