Инициализация массива с помощью самопризываемой функции

Я пытаюсь инициализировать массив с помощью самовывозной функции, для простоты предположим, что начальные значения представляют собой квадраты чисел от 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 к нему и вызывает функцию. Вам ничего не нужно, кроме вызова функции, так что просто сделайте это.

Другие вопросы по тегам