为什么我这样做
var footnoteLinks = [1,2,3];
for (var i in footnoteLinks) {
document.write(footnoteLinks[i] + ", ");
}
我得到的是...... ...
1,2,3,function(){return lower; },function Array(){[native code]},function pop(){[native code]},function push(){[native code]},function reverse(){[native code]},function shift() {[native code]},function sort(){[native code]},function splice(){[native code]},function unshift()
为什么?什么功能等...我觉得它工作正常b4,我不知道是什么导致了这一点,对于我尝试的所有浏览器似乎都一样。 Firefox 3.6,Chrome 6(我认为?),IE9
答案 0 :(得分:6)
for(var in obj)
用于迭代对象的属性。您将获得已创建的Array对象的属性。
您需要更传统的循环/索引构造:
for(var i=0,z=footnoteLinks.length; i<z; i++)
某些JavaScript运行时在Array对象上也有map
和reduce
方法,但这不能保证。但是,大多数JavaScript库都有这样的东西(或者可能是each
方法)。
答案 1 :(得分:1)
在javascript中,
for (var k in {a:1, b:2}) {
不只是迭代a和b;它还迭代该对象原型的所有成员。因为函数是javascript中的值,包括Object的所有方法。有三种方法可以避免这种情况:
答案 2 :(得分:0)
for/in
循环不能用于遍历数组,因为它还枚举了用户定义的属性(请参阅MDC documentation)。对于数组对象和forEach
循环有一个for each/in
方法,但仅限于JavaScript 1.6+(=现在用得不多)。您可能希望使用许多JavaScript框架中的一些或编写自己的实用程序函数来迭代数组:
function iterate(a, func) {
for (var i=0; i<a.length; i++)
func(a[i]);
}
iterate([1, 2], function(x) { console.log(x) });
答案 3 :(得分:0)
Weston C回答的替代方法是使用hasOwnProperty
循环中的for in
函数,如Chris Morgan所示:
for(var i in obj) if(obj.hasOwnProperty(i)) {
document.write(obj[i]);
}
是的,它比使用传统的for
循环迭代要慢。