Não é um bug. É assim que o construtor Array é definido para funcionar.
Do MDC:
Ao especificar um único parâmetro numérico com o construtor Array, você especifica o comprimento inicial da matriz. O código a seguir cria uma matriz de cinco elementos:
var billingMethod = new Array(5);
O comportamento do construtor Array depende se o único parâmetro é um número.
O .map()
método inclui apenas nos elementos de iteração da matriz que explicitamente tiveram valores atribuídos. Mesmo uma atribuição explícita de undefined
fará com que um valor seja considerado elegível para inclusão na iteração. Isso parece estranho, mas é essencialmente a diferença entre uma undefined
propriedade explícita em um objeto e uma propriedade ausente:
var x = { }, y = { z: undefined };
if (x.z === y.z) // true
O objeto x
não possui uma propriedade chamada "z" e o objeto y
possui. No entanto, nos dois casos, parece que o "valor" da propriedade é undefined
. Em uma matriz, a situação é semelhante: o valor de length
realiza implicitamente uma atribuição de valor a todos os elementos de zero a zero length - 1
. A .map()
função, portanto, não fará nada (não chamará o retorno de chamada) quando chamada em uma matriz recém-construída com o construtor Array e um argumento numérico.
var y = x.map(function(){return 0; });
e o recebo tanto no novo método Array () quanto no literal da matriz. Eu testei no Firefox 4 e Chrome.