Array.map doesn't seem to work on uninitialized arrays
If you'd like to fill an array, you can use Array(5).fill()
and the methods will then work as expected--see the alternate related answer from aasha7. Older pre-fill approaches include:
Array.apply(null, new Array(5)).map(function() { return 0; });
// [ 0, 0, 0, 0, 0 ]
After some reading one of the posts linked in the comments, I found this can also be written as
Array.apply(null, {length: 5}).map(function() { return 0; });
However, trying to use .map
on undefined values will not work.
x = new Array(10);
x.map(function() { console.log("hello"); });
// so sad, no "hello"
// [ , , , , , , , , , ]
.map
will skip over undefined values :(
I'd just like to point out that you can now do:
Array(2).fill().map(_ => 4);
This will return [4, 4]
.
That's how it's described by the ECMAScript Language specification
Here's the relevant part of Array.prototype.map
, as described by (§15.4.4.19)
- ...
- 8. Repeat, while
k < len
- a) Let
Pk
beToString(k)
. - b) Let
kPresent
be the result of calling the [[HasProperty]] internal method ofO
with argumentPk
. - c) If
kPresent
istrue
, then- do the magic
- a) Let
- ...
Since there is no initilized member in your array, calling e.g new Array (1337).hasOwnProperty (42)
evaluates to false
, hence the condition in step 8.c is not met.
You can however use a little "hack" to do what you want.
Array.apply(null, { length: 5 }).map(Number.call, Number) //[0, 1, 2, 3, 4]
How this works has been thouroughly explained by @Zirak