我正在寻找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)
显然这不是它的工作原理,那么它是如何工作的呢?
这个解决方案似乎有效,但是我的问题是...为什么?
它对您描述的内容无效(只有一个可以为真,而一个必须为真);在以下true, true, true情况下失败:
function isValid(a, b, c) { return a !== b !== c; }
console.log(isValid(true, true, true)); // true, should be falseRun Code Online (Sandbox Code Playgroud)
我应该注意,我认为您的规则与XOR不太相同,因为true XOR true XOR true是true(因为true XOR true是false,并且false XOR true是true)。
a !== b !== c 评估如下:
a !== b条件为true或false时boolean,true将对结果进行评估并产生结果false。叫那个r。在true, true, true情况下,true !== true是false这样r = false。r !== c被评估并得出boolean结果。在这种true, true, true情况下false !== true为true。从上面可以看到,它几乎可以在所有XOR情况下使用,但在所有输入均为时不起作用true。它也不适用于其他示例。也许最常见的错误的人提出的,是想看看是否a,b以及c所有具有相同的价值:
if (a === b === c) // WRONG (almost always)
Run Code Online (Sandbox Code Playgroud)
因为这((a === b) === c)是(some_boolean === c),它几乎总是错的(例如,如果a,b以及c含有什么,但boolean值)。