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