我正在尝试使用自调用函数初始化一个数组,假设为了简单起见,初始值是从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将这个新创建的对象解释为数组?
没有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);
您不需要使用new
关键字...
var arr = (function() {
var x = [];
for (var i=0; i<4; i++)
x.push(i*i);
return x;
})();
new
关键字创建一个对象并设置其构造函数,然后将this
绑定到它并调用该函数。除了调用函数之外,你不需要任何东西,所以就这样做。