1. ホーム
  2. javascript

[解決済み] オブジェクトのプロパティを反復処理中に削除しても安全ですか?

2022-09-21 13:17:51

質問

オブジェクトのプロパティを反復処理する際、for-inループの中でそれらを削除しても問題ないでしょうか?

例えば

for (var key in obj) {
    if (!obj.hasOwnProperty(key)) continue;

    if (shouldDelete(obj[key])) {
        delete obj[key];
    }
}

他の多くの言語では、配列や辞書を反復処理し、その中を削除することは安全ではありません。 JSでは大丈夫なのでしょうか?

(私はMozillaのSpidermonkeyランタイムを使用しています)。

どのように解決するのですか?

この ECMAScript 5.1 標準 セクション 12.6.4 (フォーインループについて) に書かれています。

列挙されているオブジェクトのプロパティは、列挙中に削除されることがあります。もし、列挙中にまだ訪れていないプロパティ が削除された場合、そのプロパティは訪問されません。新しいプロパティが 列挙中に列挙中のオブジェクトに新しいプロパティが追加された場合、新しく追加されたプロパティは、アクティブな列挙中に訪問されることは保証されません。 は、アクティブな列挙の中で訪問されることは保証されない。プロパティ名は、どの列挙においても複数回訪問されてはならない。

ですから、OP のコードが合法であり、期待どおりに動作することは明らかだと思います。ブラウザの癖は、一般的に反復順序と削除ステートメントに影響しますが、OP のコードが動作するかどうかは関係ありません。オブジェクト内の他のプロパティを削除すると、状況に応じて懸念されるかもしれませんが、予測不可能なことに、それらのプロパティが反復処理に含まれたり(すでに訪問されている場合)含まれなかったりすることがあります。

も参照してください。

これらのどれもがOPのコードには影響しませんが。