Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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]
like image 554
Engineer Avatar asked Jun 29 '12 17:06

Engineer


2 Answers

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.

like image 149
Rob W Avatar answered Oct 13 '22 13:10

Rob W


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.

like image 6
jbabey Avatar answered Oct 13 '22 13:10

jbabey