4

我在 MooTools 中遍历一个数组,但在使用速记for..in循环遍历数组时看到了其他项目。当我使用常规for循环时它工作正常。这是 MooTools 污染全局命名空间的问题,还是我在这里做错了什么?

有一个createTabs()函数可以遍历数组并为数组中的每个值创建一个选项卡:

function createTabs() {
    var myTabs = [["First", "a.png"], ["Second", "b.png"]];
    for(var i in myTabs) {
        var tab = new Tab(myTabs[i][0], myTabs[i][1]);
        console.log(i);
    }
}

这是的输出console.log(i)

0
1
$family
each
clean
associate
link
contains
extend
getLast
getRandom
include
combine
erase
empty
flatten
hexToRgb
rgbToHex
toJSON

我了解前 2 个索引,但其余的来自哪里?

编辑:感谢 Chetan 和 k Prime 的快速回答。这是有道理的,Array.eachMooTools 的添加是一种更简洁的迭代方式!

现在看起来好多了:

myTabs.each(function(item) {
    var tab = new Tab(item[0], item[1]);
    console.log(item);
});
4

2 回答 2

9

正如 Chetan 所指出的,for .. in它用于对象属性迭代,而不是数组。但是,您可以使用 迭代当前成员(而不是 MooTools 设置的继承成员),hasOwnProprty如下所示:

for (i in array)
    if (array.hasOwnProperty(i))
    {
        //.. do stuff ...
    }

或者,更好的是,因为您使用的是 MooTools,只需使用以下Array.each方法:

array.each (function (item, index)
{
    // ... do stuff ...
});
于 2010-01-11T05:25:33.357 回答
6

for..in不适用于数组迭代。它遍历对象的所有非内置属性。由于 MooTools 为 Array 原型添加了更多功能,因此它们现在也是数组属性。请参阅此https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Statements/For...in

只需使用基本的 for 循环进行数组迭代。

于 2010-01-11T05:18:07.327 回答