【问题标题】:XOR operator in Javascript to check against value [duplicate]Javascript中的XOR运算符检查值[重复]
【发布时间】:2018-12-12 14:40:50
【问题描述】:

所以,据我检查,javascript 没有 XOR 运算符。

还有以下-

if( ( foo && !bar ) || ( !foo && bar ) ) { ... }

如果 foo 和 bar 是布尔值,这一点很清楚。但是 XOR 可以用来检查不同类型的表达式吗?例如,如果我想根据另一个值检查一个值,那就是 -

if (type === 'configuration' XOR type2 === 'setup') { ... }

它会变成类似 -

if ( (type === 'configuration' && type2 !== 'setup') || (type !== 'configuration' && type2 === 'setup' ) ) { ... } 还是看起来不一样?

这给出了以下结果 -

type = 'configuration' && type2 = 'setup': false type = 'configurations' && type2 = 'setup': true type = 'configuration' && type2 = 'setups': true type = 'configurations' && type2 = 'setups': false

哪个匹配

0 XOR 0 = 0 0 XOR 1 = 1 1 XOR 0 = 1 1 XOR 1 = 0

但我不确定这是否适用于所有情况。

【问题讨论】:

  • 你可以定义const xor = (a, b) => a && !b || !a && b,然后直接使用xor(type === 'configuration', type2 === 'setup')。这是简单、可重用、可维护且易于阅读的。与位运算符和长逻辑表达式不同。

标签: javascript logical-operators xor


【解决方案1】:

最简单的逻辑异或是:

a !== b

或者在你的情况下:

if((type === 'configuration') !== (type2 === 'setup'))

javascript 中还有一个按位异或 (^) 也可以在这里使用,因为布尔值被转换为 0 / 1,反之亦然:

if((type === "configuration") ^ (type2 === "setup"))

【讨论】:

  • 嗯,我猜这和我写的一样吧? ^ 看起来是一个很好的解决方案,因为它更短更清晰。它是在特定的 ECMAscript 版本中引入的吗?
  • @Jogn 它可能会更短,但我认为它不会更清晰,除非您所在的团队确定您已经一眼就能理解位运算符。编写代码是为了清晰的可读性,而不是为了打高尔夫球。
  • @jogn 我在 5/6 年前学习了 JS,从那时起就存在了
  • 有关 Javascript 异或的精彩文章,请参阅:howtocreate.co.uk/xor.html
猜你喜欢
  • 1970-01-01
  • 2014-08-10
  • 2017-04-05
  • 2017-02-27
  • 2013-04-20
  • 2012-09-12
  • 2011-07-28
  • 2015-06-13
  • 2015-03-16
相关资源
最近更新 更多