Инициализация массива с помощью самопризываемой функции
Я пытаюсь инициализировать массив с помощью самовывозной функции, для простоты предположим, что начальные значения представляют собой квадраты чисел от 0 до 4. new
Ключевое слово создает новый объект, поэтому можно получить доступ к полям вновь созданного объекта с this.x
или же this[x]
внутри тела IIFE, следуя 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 интерпретировать этот вновь созданный объект как массив?
2 ответа
Без 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
к нему и вызывает функцию. Вам ничего не нужно, кроме вызова функции, так что просто сделайте это.