javascript - 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
显然这不是它的工作原理,那么它是如何工作的呢?
解决方案
这个解决方案似乎有效,但我的问题是......为什么?
它不适用于您所描述的(只有一个可以是真的,一个必须是真的);在这种情况下失败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 true
is true
(因为true XOR true
isfalse
和false XOR true
is true
)。
a !== b !== c
评估如下:
a !== b
被评估并产生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)
既然那((a === b) === c)
是(some_boolean === c)
,它几乎总是错误的(例如,如果a
,b
,并且c
包含除boolean
值之外的任何内容)。
推荐阅读
- reactjs - 自动完成在 IDE WebStorm 内的 ReactJs 插值大括号内不起作用
- c# - TreeView 不填充节点
- c# - 仅替换之前指定字符串和之后指定字符串的子字符串
- mysql - 使用两个 group by 和一个基本 tri-table 多对多模式的计数进行查询
- java - Appium 会话在同一设备上并行执行
- prolog - 如何在序言中从字符串中修剪正确的空格?
- python - 忽略 BeautifulSoup 中具有相同类的两个 div 中的第一个
- java - spring mvc(版本 5)可以用 cucumber 放心吗?
- javascript - 如何创建一个返回页面顶部的按钮?
- c++11 - 非静态二维数组的正确初始化程序是什么?