编辑:
Enumerable#each
不是迭代器类。 我正在寻找一个迭代器,类似于以下写法:var iterator = new Iterator(myCollection);
for (var element = iterator.next(); iterator.hasNext(); element = iterator.next()) {
// iterator
}
编辑:mamoo提醒我们在Mozilla的Javascript 1.7中有迭代器实现。因此,现在的目标是在Javascript 1.5(ECMA 4)中找到这个Iterator函数的实现。
编辑2:为什么在库(和ECMA 5)提供了each
方法时要使用迭代器?首先,因为each
通常会干扰this
,因为回调被call
了(这就是Prototype中为什么each
接受第二个参数的原因)。其次,因为人们对for(;;)
循环比对.each(callback)
构造更加熟悉(至少在我的领域是这样)。最后,因为迭代器可以迭代普通对象(请参见JavaScript 1.7)。
编辑3:我接受了npup的答案,但这是我的一番努力:
function Iterator(o, keysOnly) {
if (!(this instanceof arguments.callee))
return new arguments.callee(o, keysOnly);
var index = 0, keys = [];
if (!o || typeof o != "object") return;
if ('splice' in o && 'join' in o) {
while(keys.length < o.length) keys.push(keys.length);
} else {
for (p in o) if (o.hasOwnProperty(p)) keys.push(p);
}
this.next = function next() {
if (index < keys.length) {
var key = keys[index++];
return keysOnly ? key : [key, o[key]];
} else throw { name: "StopIteration" };
};
this.hasNext = function hasNext() {
return index < keys.length;
};
}
var lang = { name: 'JavaScript', birthYear: 1995 };
var it = Iterator(lang);
while (it.hasNext()) {
alert(it.next());
}
//alert(it.next()); // A StopIteration exception is thrown
var langs = ['JavaScript', 'Python', 'C++'];
var it = Iterator(langs);
while (it.hasNext()) {
alert(it.next());
}
//alert(it.next()); // A StopIteration exception is thrown
each
方法时,您是指.forEach()
方法吗? - dcorking