由於布爾值true
和false
使用它們位運算符時分別轉換爲1
和0
,按位異或^
可以做雙責爲邏輯異或,以及一個bitwiseone,只要你的價值觀是布爾值(Javascript的「truthy」值不會工作)。這與操作員的否定!
很容易達成。
a XOR b
是logially相當於表達式如下(短)名單:
!a^!b;
!a != !b;
有很多其他形式的可能 - 如!a ? !!b : !b
- 但這兩種模式都只有評估a
和b
優勢每次一次(並且如果a
爲假並因此不評估爲b
,則也不會「短路」),而使用三元運算符?:
,OR ||
或AND &&
的形式將會雙重評估或短路。
這兩個語句中的否定!
運算符很重要,因爲幾個原因:它將所有「真值」轉換爲布爾值(「」 - > false,12 - > true等等),以便位運算符具有可以使用的值,所以不等式!=
運算符只會比較每個表達式的真值(如果a
或b
是不等於非空字符串等,則a != b
將無法正常工作)等等每個評估都會返回一個布爾值結果而不是第一個「真值」值。
您可以通過添加雙重否定(或例外,!!a^!!b
,仍等同於XOR)來繼續擴展這些表單,但在否定部分表達式時要小心。這些形式可以乍一看似乎是「工作」,如果你在arithmatic分佈來看(其中2(a + b) == 2a + 2b
等)的思想,但實際上從XOR產生不同的真值表(these produce similar results to logical NXOR):
!(a^b)
!(!!a^!!b)
!!a == !!b
的XOR的一般形式,那麼,可能是功能(truth table fiddle):然後
function xor(a, b) { return !a^!b; }
和具體的例子是:
if (xor(isEmptyString(firstStr), isEmptyString(secondStr))) { ... }
或者如果isEmptyString
只返回布爾值,你不想要一個普通xor
功能,簡單地說:
if (isEmptyString(firstStr)^isEmptyString(secondStr)) { ... }
我明白這是一個非常好的問題,但我強烈反對,第一個答案是最好的。有更簡單的解決方案,如果你向下滾動... – Nico