[解決済み] オブジェクトのプロパティを反復処理中に削除しても安全ですか?
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のコードには影響しませんが。
関連
-
[解決済み] JavaScript でオブジェクトが特定のプロパティを持つかどうかを確認するにはどうすればよいですか?
-
[解決済み] オブジェクトのプロパティを値でソートする
-
[解決済み] 変数を使用してオブジェクトのプロパティに動的にアクセスする
-
[解決済み] JavaScriptはオブジェクトのプロパティの順序を保証するか?
-
[解決済み] オブジェクトのプロパティが存在するかどうかを、プロパティ名を持つ変数で確認するには?
-
[解決済み] Javascriptオブジェクトの最初のプロパティにアクセスする方法は?
-
[解決済み] JavaScriptのオブジェクトを反復処理する方法は?
-
[解決済み] 一般的なリストを繰り返しながら、そのリストから要素を削除するには?
-
[解決済み】未定義のオブジェクトプロパティを検出する
-
[解決済み] 文字列が空白であるかどうかをチェックする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 配列からオブジェクトを生成する
-
[解決済み] JavaScript で範囲を作成する - 奇妙な構文
-
[解決済み] Angularjs - 現在の日付を表示する
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
-
[解決済み] アサインの左側にJavascriptのオブジェクトブラケット表記({ ナビゲーション } =)があります。
-
[解決済み] Reactコンポーネントでthis.setStateを複数回使用するとどうなりますか?
-
[解決済み] moment.jsでミュータビリティを回避するには?
-
[解決済み] Prototypeを使ってtextareaを自動サイズ調整するには?
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] V8 Javascript エンジンのスタンドアロン実行