0

以下代码引用了 Firefox 特定的 JavaScript 1.7 实现,其中包含数组理解和迭代器/生成器。请注意,在撰写本文时,Webkit 浏览器(Chrome、Safari)尚不支持“Iterator”、“yield”和数组解析,并且似乎仅适用于 Firefox 的 JavaScript 引擎(Google、liberateme)。

注意:ECMAScript Harmony 可能会对语法带来新的变化,并可能使这篇文章过时

var myobject = {'foo':5,'bar':10};
var myarray = [10,20,30];

for (var i in it) {
console.log(i);
}

代码:

JavaScript:

//if var it = Iterator(myobject);
['foo',5]
['bar',10]
//if var it = Iterator(myarray);
[0,10]
[1,20]
[2,30]

似乎 JS 1.7 迭代器总是返回一个“键”和一个“值”(无论键是实际的对象键还是数组的索引。与 Python 相比,迭代器足够聪明,如果它只返回 1 个值)是一个数组。

Python:

#if it = iter(myobject);
[foo,5]
[bar,10]
#if it = iter(myarray);
10,
20,
30

所以问题是,当我尝试移植 Python 到 JavaScript 函数时,为什么 Iterator() 和 iter() 不做同样的事情?

4

1 回答 1

0

回答:

为了将代码从 Python 函数/库移植到 JavaScript,假设 Iterator() 和 iter() 做同样的事情有点令人沮丧,只是意识到(它们略有不同,导致开发人员不得不有时滚动他们自己的迭代器/生成器函数(使用'yield')*。

例如,假设我们想要滚动 python 的 items() 函数,该函数是 dict 对象的原生函数。

var items = items = function(object) {
        var list = [];
        for (var i in object) {
            list.push([i,object[i]]);
        }
        return list;
    };

items() 在传递myobject JavaScript 对象时工作得很好(当然,我使用的是嵌套数组而不是元组)。

items(myobject);
//[['foo':5],['bar':10]]

然而,在为 items(myobject) 构造迭代器时,我们实际上是在迭代一个列表,所以我们想要制作一个只产生第二个索引的自定义生成器来重现 Python 的功能:

    var arrayIterator = function(array){ 
    for (var i in iter) {
            yield i[1];//iterate over the non-index portion of the array iterable.
        }
    
    }

arrayIterator(items(myobject))

['foo',5]
['bar',10]

请注意,这里实际上有一些冗余。请注意

Iterator(myobject) = arrayIterator(items(myobject))

所以最后,请注意您正在迭代的内容,看看您是否可以通过避免调用最终成为彼此相反的函数来加快调用速度。

我希望所有这些都是事实准确的——如果我错了,请纠正我。

于 2012-08-31T14:31:13.813 回答