JavaScript Array迭代返回的值多于值

时间:2009-09-29 23:07:59

标签: javascript arrays prototype scriptaculous

这很简单,我感到困惑。我有以下内容:

var x = 'shrimp';    
var stypes = new Array('shrimp', 'crabs', 'oysters', 'fin_fish', 'crawfish', 'alligator');
for (t in stypes) {
    if (stypes[t] != x) {
        alert(stypes[t]);
    }
}

一旦值迭代,它就开始返回十几个函数,如

function (iterator, context) {
    var index = 0;
    iterator = iterator.bind(context);
    try {
        this._each(function (value) {iterator(value, index++);});
    } catch (e) {
        if (e != $break) {
            throw e;
        }
    }
    return this;
}

到底发生了什么事?

编辑:在这些脚本中,我正在使用http://script.aculo.us/prototype.jshttp://script.aculo.us/scriptaculous.js我记得现在阅读有关原型扩展数组的方式,我打赌这是其中的一部分。我该如何处理?

4 个答案:

答案 0 :(得分:7)

for枚举将遍历传递它的对象的每个成员。在这种情况下,一个数组恰好具有作为成员的函数以及传递的元素。

您可以重新编写for循环以检查typeof stypes[t] == "function"或yada yada。但IMO最好只修改循环到元素..

for(var i = 0, t; t = stypes[i]; ++i){
    if (t != x) {
        alert(t);
    }
}

for(var i = 0; i < stypes.length; ++i){
    if (stypes[i] != x) {
        alert(stypes[i]);
    }
}

我想将我的上一条评论迁移到答案,为第一种类型的循环添加警告的通知。

来自Simon Willison's "A re-introduction to JavaScript" ..

for (var i = 0, item; item = a[i]; i++) {
    // Do something with item
}
  

这里我们设置两个变量。   分配在中间部分   for循环也进行了测试   诚实 - 如果成功,那么   循环继续。因为我增加了   每次,数组中的项目都会   按顺序分配给项目   订购。 “falsy”时循环停止   找到项目(例如未定义)。

     

请注意,这个技巧应该只是   用于你不知道的数组   包含“falsy”值(数组)   例如,对象或DOM节点)。如果   你正在迭代数字数据   可能包括0或字符串数​​据   可能包括空字符串   你应该使用i,j idiom。

答案 1 :(得分:3)

你想做的事:

for (var i in object) {
    if (!object.hasOwnProperty(i))
        continue;
    ... do stuff ...
}

至于..in枚举迭代对象及其原型链上存在的所有属性(可枚举或其他)。 hasOwnProperty检查将迭代限制为您要枚举的实际对象上的那些属性。

ES5让图书馆开发人员的工作变得更好(并帮助避免这些东西),但我们不会在发布浏览器中看到相当长的一段时间: - (

[编辑:用继续替换return。 lalalalala;)]

答案 2 :(得分:1)

由于原型扩展了阵列以方便您使用,因此您应该利用它。您的示例可以重写为:

var x = 'shrimp';    
var stypes = new Array('shrimp', 'crabs', 'oysters', 'fin_fish', 'crawfish', 'alligator');
stypes.without(x).each(alert);

答案 3 :(得分:-3)

应该是

for (t in stypes) {
    if (t != x) {
        alert(t);
    }
}