这很简单,我感到困惑。我有以下内容:
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.js和http://script.aculo.us/scriptaculous.js我记得现在阅读有关原型扩展数组的方式,我打赌这是其中的一部分。我该如何处理?
答案 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);
}
}