無限ループの回避方法 | while文 | JavaScript 超完全入門 基本から発展までのすべて

スポンサーリンク
スポンサーリンク

無限ループとは?

無限ループは、ループが終了する条件が正しく設定されていない場合に、ループが永遠に実行され続ける現象です。JavaScriptでは、無限ループが発生すると、ブラウザやシステムのリソースを大量に消費し、プログラムが停止したりクラッシュする原因となるため、注意が必要です。

無限ループの典型的な例

無限ループが発生する典型的な例を見てみましょう。

let count = 0;

while (count < 5) {
    console.log(count);
    // countの更新がないため、条件が永遠にtrue
}

この例では、countが更新されないため、count < 5が永遠にtrueになり、ループが終了しません。これが無限ループの典型的な例です。

無限ループの回避方法

無限ループを回避するためには、ループが終了する条件をしっかりと設定する必要があります。以下に、無限ループを回避するための基本的な対策を紹介します。

1. ループ内で条件を更新する

ループが適切に終了するためには、条件が変化するように変数を更新することが重要です。次の例は、無限ループを回避した修正版です。

let count = 0;

while (count < 5) {
    console.log(count);
    count++;  // countを更新することで、条件が変化する
}

この例では、countが毎回インクリメントされ、最終的にcount < 5falseになるため、ループは正常に終了します。

2. 適切な終了条件を設定する

無限ループを回避するためには、終了条件を正確に設定することが重要です。以下の例では、終了条件が不適切で無限ループになる可能性があります。

let number = 10;

while (number !== 0.1) {
    console.log(number);
    number -= 0.2;  // 浮動小数点の計算誤差により、numberが0.1に正確に一致しない
}

この例では、浮動小数点の計算誤差によりnumber0.1に正確に一致せず、無限ループに陥る可能性があります。数値を比較する場合は、誤差を考慮して条件を設定する必要があります。

3. ループの最大回数を設定する

無限ループを防ぐために、ループの最大回数を設定する方法もあります。break文を使って、ある一定の回数に達したらループを強制的に終了することができます。

let count = 0;
let maxTries = 10;

while (true) {
    console.log("処理を実行中");
    count++;
    if (count >= maxTries) {
        console.log("ループを終了します");
        break;  // 最大回数に達したらループを終了
    }
}

この例では、ループが10回実行されるとbreak文によってループが終了します。無限ループを避けるために、最大回数を設定することは安全策の一つです。

4. 無限ループを検出するタイムアウト機能の活用

ブラウザ環境では、JavaScriptの無限ループを防ぐためにタイムアウト機能を利用することも可能です。setTimeout関数やclearTimeoutを使って、一定時間後に強制的にループを停止させることができます。

let count = 0;
let maxDuration = 1000;  // 1秒間だけループを実行する

let timeout = setTimeout(() => {
    console.log("ループが終了されました");
}, maxDuration);

while (count < 5) {
    console.log(count);
    count++;
    if (count === 5) {
        clearTimeout(timeout);  // 正常終了時にタイムアウトを解除
    }
}

この例では、1秒間だけループを実行するようにタイムアウトを設定し、正常に終了した場合はclearTimeoutでタイムアウトを解除します。これにより、予期せぬ無限ループを防ぐことができます。

まとめ

無限ループは、プログラムのパフォーマンスに悪影響を与える重大な問題です。無限ループを回避するためには、while文やdo...while文の終了条件をしっかりと設定し、ループ内で条件を適切に更新することが重要です。また、最大回数を設定したり、タイムアウト機能を活用することで、さらに安全性を高めることができます。