6

私はこのようなことをしています:

var myObj = {a:1, b:2, c:3, d:4};

for (var key in myObj){
  if (someCondition){
    delete(myObj[key]);
  }
}

私が試したサンプルでは問題なく動作しますが、特定のシナリオ/ブラウザーで予期しない動作が発生する可能性があるかどうかはわかりません。

繰り返されるオブジェクトを変更しても大丈夫ですか?

4

2 に答える 2

8

セクション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番目は表示されません。xxyx

于 2012-07-09T19:13:19.580 に答える
6

はい、安全です。

http://es5.github.com/#x12.6.4

12.6.4for-inステートメント

プロパティを列挙するメカニズムと順序(最初のアルゴリズムのステップ6.a、2番目のアルゴリズムのステップ7.a)は指定されていません。列挙されているオブジェクトのプロパティは、列挙中に削除される場合があります。列挙中にまだ訪問されていないプロパティが削除された場合、そのプロパティは訪問されません。列挙中に列挙されているオブジェクトに新しいプロパティが追加された場合、新しく追加されたプロパティがアクティブな列挙でアクセスされることが保証されません。プロパティ名は、どの列挙でも2回以上アクセスしてはなりません。

于 2012-07-09T19:12:27.490 に答える