2009-09-29 44 views
2

这太简单了,我很困惑。我有以下几点:JavaScript Array迭代返回的值超过

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我记得现在阅读原型扩展数组的方式,我打赌这是它的一部分。我如何处理它?

+0

我只是想说......代码对我来说工作得很好,某些东西必须有不同的原型。我会跟Quintin的回答一起去的。 – womp 2009-09-29 23:26:25

回答

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循环的中间部分的赋值也被测试为 真实性 - 如果成功, 循环继续。由于i每次递增 ,因此数组中的项目将按顺序 顺序分配给项目 。找到“falsy” 项目(例如未定义)时,循环停止。

请注意,这一招应该仅用于你知道不 含有“falsy”值( 对象的数组或DOM例如节点)阵列 。如果 您正在遍历可能包含0或字符串数​​据 的数字数据 ,其中可能包含空字符串 ,您应该使用i,j习语替代。

+1

downvote的任何解释,我非常感兴趣的原因。 – 2009-09-30 00:05:59

+0

只需添加到您的正确答案:'“for..in”'爬上'Array.prototype链'。见http://www.ecma-international.org/publications/standards/Ecma-262.htm(Sec 12.6.4),而标准的'for'循环则不适用。此外,用“for..in'”迭代的项目顺序不能保证。一个标准的'for'循环是。 – 2009-09-30 00:20:13

+0

这对我有效。我已经把你升回零。我不熟悉这个语法for()for(var i = 0,t;那叫什么? – jerrygarciuh 2009-09-30 00:24:32

-3

应该

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

你想做的事:

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

同时作为对象,上存在过的所有属性的for..in遍历枚举(枚举或其他方式)其原型链。 hasOwnProperty检查将迭代限制为您想要枚举的实际对象上的那些属性。

ES5让事情更好一点对于库的开发者(和帮助避免这种东西),但我们不会看到伊娜航运浏览器相当长的一段:-(

[编辑:替换为继续回报lalalalala ;)]

+0

你想'继续;',而不是'返回;'。 – ThiefMaster 2011-01-23 09:40:40

1

由于样机已扩展为您提供方便的数组,你应该好好利用这个优势。你的例子可以改写为:

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