オブジェクトのプロパティを列挙すると、ループの開始時に現在のプロパティのスナップショットが取得され、スナップショットが繰り返されるように見えることに気付きました。以下は無限ループを作成しないため、私はこのように感じます。
var obj = {a:0,b:0}, i=0;
for (var k in obj) {
obj[i++] = 0;
}
alert(i) // 2
上記のコードは、新しいプロパティを追加していることを示していますが、新しいプロパティは列挙されません。
ただし、削除演算子は私のスナップショット理論に反しているようです。これは同じコードですが、列挙される前にプロパティを削除します。
var obj = {a:0,b:0}, i=0;
for (var k in obj) {
i++;
delete obj.b;
}
alert(i) // 1
上記のコードは、ループ本体が1回だけ実行されることを示しています。スナップショット理論が真である場合、2回実行されます。
何が起きてる?javascriptには、それが使用するある種の非表示のイテレータがあり、削除演算子はそれを何らかの形で認識していますか?
--反復順序について何かを想定していることに気付きました-具体的には、反復はプロパティの挿入時間に基づいて発生します。私はすべてのブラウザがそのような実装を使用していると信じています。