神秘的'功能'被附加到阵列

时间:2012-01-10 23:20:42

标签: javascript jquery jquery-ui

我有以下代码:

    // button sets
    var sets = ['.diamond-colour','.diamond-cut','.diamond-clarity','.diamond-certificate'];
    // for each set
    for (set in sets){
        console.log('Set: '+set);
        console.log(sets[set]);
    }

控制台日志显示:

Set: 0
.diamond-colour
Set: 1
.diamond-cut
Set: 2
.diamond-clarity
Set: 3
.diamond-certificate
Set: findIndex
function (value){
var ctr = "";
for (var i=0; i < this.length; i++) {
if (this[i] == value) {
return i;
}
}
return ctr;
}

它似乎是一个新的数组元素,其键为findIndex,值为该函数。

有人会知道这是什么以及它出现的原因吗?

2 个答案:

答案 0 :(得分:6)

您应该使用传统的for循环来迭代数组,否则您可能会选择由您或第三方代码添加的属性(在本例中为新函数)。

for(var i = 0; i < sets.length; i++) {

正如其他人所提到的,缓存长度可以提供最佳性能:

for(var i = 0, len=sets.length; i < len; i++) {

答案 1 :(得分:4)

这是因为Javascript中带有for循环的in运算符循环遍历对象的属性,而不仅仅是“数组”中的对象。我说“数组”因为Javascript数组实际上只是为数组中的每个条目创建数字属性的对象(以及一些其他方法和属性,如.length)。

正如Dennis所说,你会想要使用传统的for循环来遍历数组中的对象。

另请注意,对此类for循环进行简单优化是在循环开始时初始化长度值,而不是每次都评估array.length

for (var i = 0, len = sets.length; i < len; i++) {
    // ...
}