Varje villkorssats du någonsin kommer att skriva är uppbyggd av fyra grundläggande operatorer: AND, OR, NOT och XOR. När dessa väl sitter i ryggmärgen blir det dramatiskt lättare att läsa komplexa villkorssatser.
AND (&&)
AND returnerar true bara när båda sidorna är sanna.
isAdult && hasTicket // true bara om båda villkoren är uppfyllda
| A | B | A AND B |
|---|---|---|
| true | true | true |
| true | false | false |
| false | true | false |
| false | false | false |
OR (||)
OR returnerar true när minst en sida är sann.
isAdmin || isModerator // true om någon av rollerna gäller
| A | B | A OR B |
|---|---|---|
| true | true | true |
| true | false | true |
| false | true | true |
| false | false | false |
NOT (!)
NOT vänder helt enkelt på ett värde. Det är en unär operator — den behöver bara en indata.
!isBanned // true när isBanned är false, och vice versa
| A | NOT A |
|---|---|
| true | false |
| false | true |
XOR (exklusivt eller)
XOR är mindre vanligt i vardaglig kod, men dyker upp i feature flags, toggle-logik och paritetskontroller. Den returnerar true bara när de två sidorna är olika.
// Många språk har ingen dedikerad XOR-operator för booleaner,
// så den skrivs ofta så här:
const xor = (a, b) => a !== b;
| A | B | A XOR B |
|---|---|---|
| true | true | false |
| true | false | true |
| false | true | true |
| false | false | false |
Prioritetsordning spelar roll
Precis som aritmetik har en operationsordning, har boolesk logik det också. NOT binder starkast, sedan AND, och sedan OR. Det betyder att:
a || b && c
// utvärderas som:
a || (b && c)
Är du osäker, lägg till parenteser. Explicit gruppering kostar ingenting och räddar nästa utvecklare (ofta du själv, sex månader senare) från att behöva räkna ut prioritetsreglerna på nytt.