条件で処理や代入する値を分岐する方法について学びます。
## Reference
- [条件分岐 · JavaScript Primer \#jsprimer](https://jsprimer.net/basic/condition/)
## Lesson
条件分岐にはif文を使います。
```js
if (条件) {
// 条件に一致した場合の処理
}
```
条件に当てはまらない場合に処理を分けたい場合は、if-else文を使います。
```js
if (条件) {
// 条件に一致した場合の処理
} else {
// 条件に一致しなかった場合の処理
}
```
場合によってはswitch文を使った方が分かりやすくなります。`break` を忘れないように注意しましょう。
```js
// 0, 1, 2, 3 のいずれかをランダムに生成
const r = Math.round(Math.random() * 3);
switch (r) {
case 0:
console.log("zero");
break;
case 1:
console.log("one");
break;
case 2:
console.log("two");
break;
case 3:
console.log("three");
break;
default:
console.error(`Unexpected error ${r}`);
}
```
変数への代入を行う場合は[[三項演算子 (JavaScript)|三項演算子]]を使うと再代入が不要になります。
```js
const r = 条件 ? 条件を満たす場合 : 条件を満たさない場合
```
## Mission 1
#😁EASY
以下のコードを `else` を使わない実装にリファクタリングしてください。ただし、**[[三項演算子 (JavaScript)|三項演算子]]は使わない**でください。
```js
/**
* 約50%の確率で0かnullを返す
*/
function selectZeroOrNull() {
if (Math.random() > 0.5) {
return 0;
} else {
return null;
}
}
```
%%
解答例
```js
/**
* 約50%の確率で0かnullを返す
*/
function selectZeroOrNull() {
if (Math.random() > 0.5) {
return 0;
}
return null;
}
```
%%
## Mission 2
#😁EASY
[[#Mission 1]]で **リファクタリングしたコード** を **[[三項演算子 (JavaScript)|三項演算子]]を使った** 実装に変えてください。
%%
解答例
```js
/**
* 約50%の確率で0かnullを返す
*/
function selectZeroOrNull() {
return Math.random() > 0.5 ? 0 : null;
}
```
%%
## Mission 3
#😁EASY
以下は[[#Mission 1]]や[[#Mission 2]]で実装した `selectZeroOrNull` 関数を利用したコードです。このコードが **間違っている理由** を説明してください。
```js
const r = selectZeroOrNull();
// 結果がnullの場合は例外を送出する
if (!r) {
throw Error("nullが発生しました!");
}
// 結果がnullでなければ出力
console.log(`結果は ${r} でした`);
```
%%
解答例
`0` も `null` も [[Falsy (JavaScript)|Falsy]]であるため、if文の値は常に[[Truthy (JavaScript)|Truthy]]となり、常にブロック内の例外送出処理が実行されるから。
%%
## Mission 4
#😁EASY
[[#Mission 3]]のコードを正しく修正してください。
%%
解答例
[[等価演算子 (JavaScript)|等価演算子]] ( `r == null` ) でもOK。
```js
const r = selectZeroOrNull();
// 結果がnullの場合は例外を送出する
if (r === null) {
throw Error("nullが発生しました!");
}
// 結果がnullでなければ出力
console.log(`結果は ${r} でした`);
```
%%
---
*NEXT* >> [[📗TDQ-010 Denoのテスト]]