TL;DR
このページでは、OR 演算子の実装方法について詳しく解説しますね。一言でいうと、OR 演算子とは、複数の条件のうち、一つでも真であれば全体が真となる演算子のことです。これにより、プログラム内で複数の条件を柔軟に扱うことができます。
開発環境 | バージョン |
---|---|
Next.js | 13.4.4 |
TypeScript | 5.0.4 |
Emotion | 11.11.0 |
React | 18.2.0 |
OR 演算子とは?
OR 演算子は、論理演算子の一つで、複数の条件式の中から少なくとも一つの条件式が真であれば全体を真と評価する役割があります。JavaScript や TypeScript では、「||」という記号を使って表現します。
以下に、基本的な使用例を示します。
const conditionA = true
const conditionB = false
if (conditionA || conditionB) {
console.log('少なくとも一つの条件が真です。')
}
上記のコードでは、conditionA
は真、conditionB
は偽ですが、OR 演算子が使われているため、「少なくとも一つの条件が真です。」というメッセージが出力されます。
短絡評価
JavaScript の OR 演算子(||
)は「短絡評価」(short-circuit evaluation)という概念を用いて動作します。これは、OR 演算子の左辺がtrue
に評価された場合、その時点で全体の結果がtrue
であることが確定するため、右辺の評価をスキップする、という動作のことを指します。
さらに詳しく説明すると、JavaScript の OR 演算子は左から右に評価を進めます。左辺の評価結果がtrue
(あるいはtrue
に変換される値、たとえば非空の文字列や非ゼロの数値など)であれば、その時点で全体の結果がtrue
であることが確定するので、右辺の評価は省略されます。これが「短絡(short-circuit)」の名前の由来です。
また、JavaScript の OR 演算子は、true
またはfalse
というブール値を返すだけでなく、評価された値そのものを返すという特性も持っています。このため、以下のようなコードが可能です。
const value1 = 0 // falsy value
const value2 = 'Hello' // truthy value
const result = value1 || value2
console.log(result) // "Hello"
上記のコードでは、value1
はfalse
に変換される値(falsy
)であり、value2
はtrue
に変換される値(truthy
)です。そのため、value1 || value2
の結果は、value2
の値("Hello"
)そのものが返されます。
これは、短絡評価という概念と合わせて利用されることで、デフォルト値の指定などによく使われます。例えば、関数の引数が省略された場合のデフォルト値の設定などに活用できます。
function greet(name) {
name = name || 'Guest'
console.log('Hello, ' + name + '!')
}
greet('John') // Hello, John!
greet() // Hello, Guest!
上記の例では、greet
関数が引数なしで呼び出された場合、name
はundefined
となり、その結果name || "Guest"
は"Guest"
を返します。これにより、name
が省略されたときのデフォルト値として"Guest"
が設定されるわけです。
OR 演算子(||
)も同じように短絡評価が行われます。具体的には、OR 演算子の左辺の評価結果がtrue
になる値であれば、その時点で全体の評価を終え、その値を結果として返します。つまり、右辺の評価はスキップされます。
基本的な OR 演算子の短絡評価の例をご紹介しましょう。
console.log(true || false) // true
console.log(false || true) // true
console.log('Hello' || '') // 'Hello'
console.log('' || 'World') // 'World'
ここで、重要なのは JavaScript におけるtrue
と評価される値(truthy な値)とfalse
と評価される値(falsy な値)を理解することです。例えば、空文字列や数値の0
は falsy な値として扱われます。それに対して、空でない文字列や0
以外の数値は truthy な値として扱われます。
続いて、OR 演算子の短絡評価を利用したデフォルト値の設定の例を見てみましょう。
type User = {
name: string
age: number
bio?: string
}
const user: User = {
name: 'Taro',
age: 30,
}
const bio = user.bio || 'No bio available'
console.log(bio) // 'No bio available'
上記の例では、user.bio
がundefined
(つまり設定されていない)場合には、'No bio available'
というデフォルト値を設定しています。
このように、OR 演算子を用いた短絡評価は、デフォルト値の設定など、様々な場面で有用なテクニックとなります。ただし、これも AND 演算子と同様に、使用する際は注意が必要です。特に、期待する値が falsy な値である可能性がある場合(例えば、false
や0
が正当な値である場合など)には、不適切なデフォルト値が設定されてしまう可能性があるため、注意が必要です。
短絡評価は、JavaScript において非常に便利な機能で、様々な場面で用いられます。以下に、その一部をご紹介します。
オブジェクトのプロパティへのアクセス
JavaScript において、存在しないオブジェクトのプロパティにアクセスしようとすると、undefined
が返されます。これをそのまま利用すると問題になる場面があるため、通常は存在チェックを行います。
type User = {
name: string
age: number
profile?: {
bio: string
website?: string
}
}
const user: User = {
name: 'Taro',
age: 30,
profile: {
bio: 'Hello, world!',
},
}
const website = user.profile && user.profile.website ? user.profile.website : 'N/A'
console.log(website) // 'N/A'
上記の例では、user.profile.website
が存在しない場合には、デフォルト値として'N/A'
を設定しています。
条件付き関数の実行
特定の条件が真の場合のみ関数を実行したい、という場合もあります。以下の例では、isDebugMode
がtrue
の場合のみ、デバッグメッセージをコンソールに出力します。
const isDebugMode = true
isDebugMode && console.log('Debugging...')
// "Debugging..."と出力されます
const isDebugMode = false
isDebugMode && console.log('Debugging...')
// 何も出力されません
これは短絡評価の特性を利用したコードで、isDebugMode
がfalse
の場合、console.log('Debugging...')
は実行されません。
以上のように、短絡評価はコードを簡潔に記述するための強力なツールとなります。ただし、それが結果的にコードの可読性を下げるような使い方をすることは避けてください。つまり、複雑な条件式を短絡評価で処理するのではなく、適切な制御構文(if 文や switch 文など)を使用する方が良い場合もあります。また、短絡評価の結果を変数に格納する場合、その変数がどのような型の値を持つ可能性があるのかを明確にすることも重要です。
Next.js で、OR 演算子を実装
それでは、Next.js と TypeScript を使って、OR 演算子を使用する状況を具体的に見ていきましょう。ここでは、ユーザーが特定の権限を持っているかどうかを判定するコンポーネントを作成します。
まずは、components/PermissionChecker.tsx
というコンポーネントを作ります。
// components/PermissionChecker.tsx
type Props = {
isAdmin: boolean
isModerator: boolean
}
const PermissionChecker = ({ isAdmin, isModerator }: Props) => {
if (isAdmin || isModerator) {
return <div>管理者権限を持っています。</div>
} else {
return <div>管理者権限を持っていません 。</div>
}
}
export default PermissionChecker
上記のコンポーネントでは、props としてisAdmin
とisModerator
を受け取り、ユーザーが管理者(isAdmin
)かモデレーター(isModerator
)のいずれかであれば「管理者権限を持っています。」というメッセージを表示します。OR 演算子が使われているため、いずれか一つでも真であれば「管理者権限を持っています。」と表示されます。
OR 演算子を実装
さらにテクニカルな例として、Next.js でのページ遷移を制御するためのコードを考えてみましょう。例えば、ユーザーがログインしているか、または特定の条件を満たしている場合にのみページ遷移を許可するようなケースです。
// pages/Dashboard.tsx
import { useRouter } from 'next/router'
import { useEffect } from 'react'
type Props = {
isLoggedIn: boolean
isSpecialCondition: boolean
}
const Dashboard = ({ isLoggedIn, isSpecialCondition }: Props) => {
const router = useRouter()
useEffect(() => {
if (!(isLoggedIn || isSpecialCondition)) {
router.push('/login')
}
}, [isLoggedIn, isSpecialCondition, router])
return <div>ダッシュボード</div>
}
export default Dashboard
上記のコードでは、isLoggedIn
(ログイン状態)かisSpecialCondition
(特定の条件)のいずれかが真でなければ、/login
ページへリダイレクトします。これは、!(isLoggedIn || isSpecialCondition)
という式により、どちらも偽である場合に限り真となるように実装されています。
以上、OR 演算子の使い方とその活用例を Next.js と TypeScript の視点から解説しました。これらを理解し活用することで、より柔軟な条件分岐を実装できるようになるでしょう。