JavaScriptを書くなら必ず覚えるべきド・モルガンの法則

ド・モルガンの法則とは

ド・モルガンの法則は論理演算における否定(!)の扱い方を示す法則です。

この法則により複雑な条件を簡単に書き換えたり、コードを理解しやすくしたりできます。

ド・モルガンの法則の2つの基本形

ド・モルガンの法則にはNOT(A AND B)とNOT(A OR B)の2つの基本形が存在します。

JavaScriptで書くとそれぞれ次のように表現できます。

NOT(A AND B)

JavaScript
!(A && B) === !A || !B

NOT(A AND B)は例えば以下のようなフォームの未入力チェックのコードなどで使えます。

JavaScript
const username = ''
const email = 'foo@example.com'

// !(A && B)
if (!(username && email)) {
  console.log('エラー: どちらかの項目が未入力です')
}

// !A || !B
if (!username || !email) {
  console.log('エラー: どちらかの項目が未入力です')
}

!(A && B) よりも !A || !B のように括弧が少ないほうが可読性が良いので、もし !(A && B) のコードがあったら !username || !email に書き換えが可能だということを覚えておくと良いでしょう。

NOT(A OR B)

JavaScript
!(A || B) === !A && !B

NOT(A OR B)は例えば以下のような権限の判定のコードなどで使えます。

JavaScript
const isLoggedIn = false
const isAdmin = false

// !(A || B)
if (!(isLoggedIn || isAdmin)) {
  console.log('アクセス権限がありません')
}

// !A && !B
if (!A && !B) {
  console.log('アクセス権限がありません')
}

NOT(A OR B)のときも !(A || B) より !A && !B のほうが括弧が少ない書き方になるので、後者のほうが可読性が良くなります。

NOT(A AND B AND C)やNOT (A OR B OR C)もある

前述の2つは基本形で、NOT(A AND B AND C)やNOT (A OR B OR C)も成立します。

NOT(A AND B AND C)

JavaScript
!(A && B && C) === !A || !B || !C
JavaScript
const username = 'sato'
const email = 'foo@example.com'
const tel = ''

// !(A && B && C)
if (!(username && email && tel)) {
  console.log('エラー: いずれかの項目が未入力です')
}

// !A || !B || !C
if (!username || !email || !tel) {
  console.log('エラー: いずれかの項目が未入力です')
}

NOT(A OR B OR C)

JavaScript
!(A || B || C) === !A && !B && !C
JavaScript
const isAdmin = false
const isLoggedIn = false
const isPermission = false

// !(A || B || C)
if (!(isAdmin || isLoggedIn || isPermission)) {
  console.log('アクセス権限がありません')
}

// !A && !B && !C
if (!isAdmin && !isLoggedIn && !isPermission) {
  console.log('アクセス権限がありません')
}

まとめ

ド・モルガンの法則のNOT(A AND B)とNOT(A OR B)についてJavaScriptで解説しました。

この法則を知っておけば「if (!(isAdmin || isLoggedIn || isPermission)) {」のような括弧が入れ子の可読性が悪いコードがあっても、瞬時に「if (!isAdmin && !isLoggedIn && !isPermission) {」に書き換えることができます。

JavaScriptなどのプログラミング言語でコードを書くなら必ず覚えたほうが良いでしょう。