我正在寻找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
显然这不是它的工作原理,那么它是如何工作的?
答案 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 true
是true
(因为true XOR true
是false
和{{ 1}}是false XOR true
)。
true
的评估如下:
a !== b !== c
进行评估并得出a !== b
的结果;如果条件为true,则为boolean
;如果条件为false,则为true
。称为false
。在r
情况下,true, true, true
是true !== true
,所以false
。r = false
进行评估并得出其r !== c
的结果。在boolean
情况下,true, true, true
是false !== true
。从上面可以看到,它几乎可以在所有XOR情况下使用,但在所有输入均为true
时则无效。它也不适用于其他示例。人们可能最常见的错误是试图查看true
,a
和b
是否都具有相同的值:
c
由于if (a === b === c) // WRONG (almost always)
是((a === b) === c)
,所以几乎总是错误的(例如,如果(some_boolean === c)
,a
和b
包含{{ 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