Undefined values in Array(len) initializer
Consider:
var a = Array(3);
var b = [undefined,undefined,undefined];
What's the reason that a.map
and b.map
produce different results?
a.map(function(){ return 0; }); //produces -> [undefined,undefined,undefined]
b.map(function(){ return 0; }); //produces -> [0,0,0]
Solution 1:
The array constructor creates an array with the given length. It does not create the keys. Array.prototype.map
's callback function is only executed for the elements in the list.
That is, all values which are associated with a key (integer) 0 ≤ i < length.
-
Array(3)
has zero keys, so.map
's callback is never triggered. -
[void 0, void 0, void 0]
has three keys, for which the callback function is executed.Array(3).hasOwnProperty(0); // false [void 0, void 0, void 0].hasOwnProperty(0); // true
The specification and its polyfill are mentioned at MDN. At line 47, if (k in O) {
shows that non-existant keys are not treated by the callback function.
Solution 2:
From MDN:
callback is invoked only for indexes of the array which have assigned values; it is not invoked for indexes which have been deleted or which have never been assigned values.
For the array a
, you've instantiated an array of length 3 but have not assigned any values. The map function finds no elements with assigned values, so it does not produce a new array.
For the array b
, you've instantiated an array of 3 elements, each with the value undefined
. The map function finds 3 elements with assigned values, and returns '0' as the new value for each of them in a new array.