使用自调用函数进行数组初始化

问题描述 投票:2回答:2

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

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

现在,您可以访问变量arr的相应字段,如arr[4],并获取16。如果你只使用arr和一个对象一起工作,那就完全没问题,但是一旦你尝试像对待数组一样对待它,你就会遇到问题。也就是说,您不能将reduce等函数应用于它:

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

那是因为arr实际上是一个对象,而不是一个数组:

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

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

javascript iife self-invoking-function
2个回答
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);

3
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.