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

时间:2019-08-29 16:41:49

标签: 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

此外,所有变量均为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

我的想法是这样执行:

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

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

2 个答案:

答案 0 :(得分:6)

  

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

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

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

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

我应该注意,由于true XOR true XOR truetrue(因为true XOR truefalse和{{ 1}}是false XOR true)。

true的评估如下:

  • a !== b !== c进行评估并得出a !== b的结果;如果条件为true,则为boolean;如果条件为false,则为true。称为false。在r情况下,true, true, truetrue !== true,所以false
  • r = false进行评估并得出其r !== c的结果。在boolean情况下,true, true, truefalse !== true

从上面可以看到,它几乎可以在所有XOR情况下使用,但在所有输入均为true时则无效。它也不适用于其他示例。人们可能最常见的错误是试图查看trueab是否都具有相同的值:

c

由于if (a === b === c) // WRONG (almost always) ((a === b) === c),所以几乎总是错误的(例如,如果(some_boolean === c)ab包含{{ 1}}值。

答案 1 :(得分:3)

由于运算符具有相同的优先级,因此Associativity决定如何对其进行评估Operator precedence

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

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

您可以逐步了解它

   a !== b   -> this return `false` as false !== false 

现在条件是

 false !== c  -> this return `true` as false !== true