Недавно я обнаружил следующий фрагмент кода на SO, чтобы помочь быстро заполнить массив значениями по умолчанию:
Array.apply(null, new Array(3)).map(function() {return 0;});
Учитывая поведение конструктора Array и метода apply, приведенный выше фрагмент можно также переписать как таковой:
Array.apply(null, [undefined, undefined, undefined]).map(function() {return 0;});
Этот метод также полезен при работе с разреженными массивами, которые вы хотите заполнить значениями по умолчанию:
var sparseArr = [3,,,4,1,,],
denseArr = Array.apply(null, sparseArr).map(function(e) {
return e === undefined ? 0 : e;
});
// denseArr = [3,0,0,4,1,0]
Однако в этом случае возникают две странности:
- Если конечный член
sparseArr
равен undefined, этот термин не отображается вdenseArr
- Если
sparseArr
содержит только один член (например,sparseArr = [1]
) или один термин, за которым следует один конечный член undefined (например,sparseArr = [1,]
), итоговыйdenseArr
равен[undefined x 1]
Может ли кто-нибудь объяснить это поведение?