for
循环意味着iterate
在递增/递减时。
// note that I'm making this big and ugly to show what's going on
var incrementor = 1, length = 10,
array = [ "one", "two", "three", "four", "five",
"six", "seven", "eight", "nine", "ten" ];
for (; incrementor <= length; incrementor = incrementor + 1) {
console.log(incrementor); // 1,2,3,...,10
console.log( array[incrementor - 1] ); // "one", "two", "three", ..., "ten"
}
for ... in ...
循环旨在enumerate
通过对象属性。
var object = { "key1" : "one", "key2" : "two", "key3" : "three" },
key = "";
for (key in object) {
console.log(key); // "key1", "key2", "key3"
console.log( object[key] ); // "one", "two", "three"
}
您使用for
数组的原因是因为在不良浏览器上,for ... in ...
不仅可以包括数字属性(即:)key=0, key=1,...
,而且还可以枚举您不希望它... ...之类的东西key=splice, key=length, key=unshift
。如果您在专业站点上运行此代码,或者在特定硬件上运行的 JS 专用版本,或者在 Unity 或 Unreal Editor 的 UnrealScript 等程序中作为脚本语言运行,这并不是一件好事。
您不使用iterator
on 对象的原因是因为您通常不会制作如下对象:
var obj = { "0" : "zero", "1" : "one", "2" : "two" };
即使你这样做了(例如,jQuery 做了类似的事情),你可能想要枚举基于单词的属性,但你不能,因为你在计数。
同样重要的是要注意:enumerating
withfor ... in ...
的功能没有标准化。这意味着不能 100% 保证按照您期望的顺序吐出值。如果您依赖循环运行,0,1,2,3,...
则for ... in ...
不能保证 100% 的浏览器会这样做, 100% 的时间 - 即使大多数浏览器大部分时间都正确。
大多数情况下,他们现在遵循先进先出规则。如果您构建您的对象{ one : 1, two : 2, three : 3 }
,任何现代浏览器都会打印1,2,3
。如果您像这样构建对象:{ two: 2, one: 1, six: 6 }
,您将获得2,1,6
.
但这是 95% 的时间“应该”,而不是 100% 的时间“将”。