我注意到在枚举对象的属性时,似乎在循环开始时拍摄了当前属性的快照,然后迭代快照。我有这种感觉是因为以下内容不会造成无限循环:
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
上面的代码演示了循环体只执行了一次。如果快照理论是真的,它会执行两次。
这里发生了什么?javascript 是否有某种类型的隐藏迭代器,它使用,并且删除操作员不知何故知道它?
——我意识到我假设了一些关于迭代顺序的东西——特别是迭代是基于属性插入时间发生的。我相信所有浏览器都使用这样的实现。