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 的原因是因为您通常不会制作像这样的对象:
var obj = { "0" : "zero", "1" : "one", "2" : "two" };
即使你这样做了(例如,jQuery 做了类似的事情),你可能想要枚举基于单词的属性,但你不能,因为你在计数。
还需要注意:enumerating 和 for ... 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% 的时间“将”。