2

我正在尝试使用自调用函数初始化一个数组,为了简单起见,假设初始值是从 0 到 4 的数字的平方。new关键字创建新对象,因此可以使用this.x或访问新创建对象的字段this[x]在 IIFE 主体内,跟在new关键字之后。代码是:

var arr = new (function() {
    for (var i=0; i<5; i++) { this[i]=i*i; }
})();

现在,您可以访问变量arrlike的相应字段arr[4],并获取16。如果您只使用 like 处理一个对象,那很好arr,但是一旦您尝试将其视为数组,您就会遇到问题。即,您不能reduce对它应用类似的功能:

< arr.reduce(...);
> TypeError: arr.reduce is not a function

那是因为arr真的是一个对象,而不是一个数组:

< arr;
> ({0:0, 1:1, 2:4, 3:9, 4:16})

所以这是我的问题:如何在这种方法中避免这种行为?如何让 JavaScript 将这个新创建的对象解释为数组?

4

2 回答 2

3

您不需要为此使用new关键字...

var arr = (function() {
               var x = [];
               for (var i=0; i<4; i++)
                   x.push(i*i);
               return x;
           })();

new关键字创建一个对象并设置其构造函数,然后绑定到this它并调用该函数。除了调用函数之外,您不需要任何其他东西,所以就这样做。

于 2012-09-23T16:28:22.660 回答
3

如果没有 IEFE,它会更短更清晰:

var arr = [];
for (var i=0; i<5; i++) arr[i] = i*i;

如果没有额外的计数器变量i,你可以这样做:

for (var arr=[]; arr.length<5; ) arr[arr.length] = Math.pow(arr.length, 2);
于 2012-09-23T17:04:50.293 回答