他の言語での開発経験がある方にとって、JavaScriptの制御構文の多くは馴染み深いものでしょう。しかし、JavaScript特有の「真偽値の評価(Truthy/Falsy)」や「反復処理(Iteration)の種類の多さ」は、バグを生みやすいポイントでもあります。
この章では、構文そのものだけでなく、JavaScriptならではの挙動やベストプラクティスに焦点を当てて解説します。
基本的な if 文の構造はC言語やJavaと同様です。しかし、条件式における評価はJavaScript特有の**Truthy(真と見なされる値)とFalsy(偽と見なされる値)**の概念を理解する必要があります。
厳密な true / false だけでなく、あらゆる値が条件式の中で真偽判定されます。
Falsyな値(falseとして扱われるもの):
false0, -0, 0n (BigInt)"" (空文字)nullundefinedNaNTruthyな値(trueとして扱われるもの):
[] や 空のオブジェクト {} は Truthy です(Pythonなどの経験者は注意が必要です)。"0" や "false" もTruthyです。> if (0) { 'True'; } else { 'False'; }
'False'
> if ("") { 'True'; } else { 'False'; }
'False'
> if ([]) { 'True'; } else { 'False'; } // 空配列は真!
'True'
> const user = { name: "Alice" };
> if (user) { `Hello ${user.name}`; }
'Hello Alice'
switch 文も標準的ですが、比較が 厳密等価演算子 (===) で行われる点に注意してください。型変換は行われません。
const status = "200"; // 文字列
switch (status) {
case 200: // 数値の200と比較 -> false
console.log("OK (Number)");
break;
case "200": // 文字列の"200"と比較 -> true
console.log("OK (String)");
break;
default:
console.log("Unknown status");
}node switch_example.jsOK (String)
while, do...while, および古典的な for ループは、C/Java/C++等の構文とほぼ同じです。
> for (let i = 0; i < 3; i++) { console.log(i); }
0
1
2
> let count = 0;
> while (count < 3) { console.log(count++); }
0
1
2
現代のJavaScript開発において、最も重要なのがこの2つのループの使い分けです。これらは似ていますが、役割が明確に異なります。
for...in はオブジェクトの キー(プロパティ名) を列挙するために設計されています。
配列に対して使用すると、インデックス("0", "1", ...)が文字列として返ってくるだけでなく、プロトタイプチェーン上のプロパティまで列挙してしまうリスクがあるため、配列への使用は推奨されません。
const user = {
name: "Bob",
age: 30,
role: "admin"
};
// オブジェクトのキーを列挙する
for (const key in user) {
console.log(`${key}: ${user[key]}`);
}
// 配列に対する for...in(非推奨の例)
const colors = ["Red", "Green"];
Array.prototype.badProp = "Do not do this"; // プロトタイプ汚染のシミュレーション
console.log("--- Array via for...in ---");
for (const index in colors) {
console.log(index); // "0", "1", "badProp" が出力される可能性がある
}node for_in_example.jsname: Bob age: 30 role: admin --- Array via for...in --- 0 1 badProp
ES2015 (ES6) で導入された for...of は、値(Values) を反復します。
配列、文字列、Map、Setなどの Iterable(反復可能) なオブジェクトに対して使用します。配列の中身を順番に処理したい場合は、こちらが正解です。
const languages = ["JavaScript", "Python", "Go"];
// 配列の値を直接取得できる
for (const lang of languages) {
console.log(lang);
}
// 文字列もIterable
const word = "AI";
for (const char of word) {
console.log(char);
}node for_of_example.jsJavaScript Python Go A I
| 構文 | 取得するもの | 対象 | 推奨ユースケース |
|---|---|---|---|
for...in | キー (Key) | Object | オブジェクトのプロパティ調査 |
for...of | 値 (Value) | Array, String, Map, Set | 配列やリストデータの処理 |
Tips: オブジェクトの中身を
for...ofで回したい場合は、Object.keys(),Object.values(),Object.entries()を使うのがモダンな手法です。
> const obj = { a: 1, b: 2 };
> for (const [key, val] of Object.entries(obj)) { console.log(key, val); }
a 1
b 2
JavaScriptの例外処理は try...catch...finally 構文を使用します。
実行時にエラーが発生すると、処理が中断され catch ブロックに移行します。
function parseJson(jsonString) {
try {
const result = JSON.parse(jsonString);
console.log("パース成功:", result);
return result;
} catch (e) {
// エラーオブジェクトが e に入る
console.error("パース失敗:", e.name, e.message);
} finally {
console.log("処理終了(成功・失敗に関わらず実行)");
}
}
parseJson('{"valid": true}');
console.log("---");
parseJson('Invalid JSON');node try_catch.jsパース成功: { valid: true }
処理終了(成功・失敗に関わらず実行)
---
パース失敗: SyntaxError Unexpected token I in JSON at position 0
処理終了(成功・失敗に関わらず実行)JavaScriptでは throw で例外を投げることができます。Error オブジェクトを投げるのが一般的ですが、技術的には文字列や数値など、任意の値を投げることが可能です(ただし、スタックトレースが取れなくなるため推奨されません)。
> try { throw new Error("Something went wrong"); } catch (e) { console.log(e.message); }
Something went wrong
> // プリミティブ値を投げることも可能だが非推奨
> try { throw "Just a string"; } catch (e) { console.log(typeof e, e); }
string Just a string
if 文での [] や {} は Truthy であることに注意。switch は厳密等価 (===) で判定される。
for, while は他のC系言語と同じ。try...catch...finally で行う。throw は任意の値を投げられるが、通常は Error オブジェクトを使用する。以下の数値が入った配列 numbers があります。
for...of ループを使用して、偶数かつ10より大きい数値 だけを抽出し、その合計値を計算してコンソールに出力するプログラムを書いてください。
const numbers = [5, 12, 8, 20, 7, 3, 14, 30]; // ここにコードを書く
node practice3_1.js以下の仕様を満たす関数 executeCommand(command) を switch 文と try...catch を用いて作成してください。
command は文字列を受け取る。"start" の場合、"System starting..." を出力。"stop" の場合、"System stopping..." を出力。Error オブジェクトを throw する(メッセージは "Unknown command")。try...catch ブロックを用いてこの関数を呼び出し、エラーが発生した場合は "Error caught: Unknown command" のように出力する。ヒント: command が null や undefined の場合もエラーとして処理されるように実装してください。
function executeCommand(command) {
}node practice3_2.js