私はこのようなことをしています:
var myObj = {a:1, b:2, c:3, d:4};
for (var key in myObj){
if (someCondition){
delete(myObj[key]);
}
}
私が試したサンプルでは問題なく動作しますが、特定のシナリオ/ブラウザーで予期しない動作が発生する可能性があるかどうかはわかりません。
繰り返されるオブジェクトを変更しても大丈夫ですか?
私はこのようなことをしています:
var myObj = {a:1, b:2, c:3, d:4};
for (var key in myObj){
if (someCondition){
delete(myObj[key]);
}
}
私が試したサンプルでは問題なく動作しますが、特定のシナリオ/ブラウザーで予期しない動作が発生する可能性があるかどうかはわかりません。
繰り返されるオブジェクトを変更しても大丈夫ですか?
セクション12.6.4for..in
は、「次のプロパティ」の観点から定義されていることを説明しています。
[[Enumerable]]属性がtrueであるobjの次のプロパティの名前をPとします。そのようなプロパティがない場合は、(通常、V、空)を返します。
「次のプロパティ」の概念は、ミューテーションが存在する場合でも(反復順序はそうではありませんが)明確に定義されているため、反復delete
中に未定義の動作が発生することはありません。
delete
のようにプロトタイププロパティのマスクを解除するコーナーケースがあります
var obj = Object.create({ x: 1 });
obj.y = 2;
obj.x = 3;
for (var k in obj) {
if (k == 'y') { delete obj.x; }
alert(k);
}
この場合、繰り返しy
て削除する可能性がありますが、プロトタイプからx
は引き続き表示されますが、最初に繰り返した場合は、2番目は表示されません。x
x
y
x
はい、安全です。
http://es5.github.com/#x12.6.4
12.6.4for-inステートメント
プロパティを列挙するメカニズムと順序(最初のアルゴリズムのステップ6.a、2番目のアルゴリズムのステップ7.a)は指定されていません。列挙されているオブジェクトのプロパティは、列挙中に削除される場合があります。列挙中にまだ訪問されていないプロパティが削除された場合、そのプロパティは訪問されません。列挙中に列挙されているオブジェクトに新しいプロパティが追加された場合、新しく追加されたプロパティがアクティブな列挙でアクセスされることが保証されません。プロパティ名は、どの列挙でも2回以上アクセスしてはなりません。