Using the Chrome Console, this is my input and output:
[0].map(Array);
[[0, 0, [0]]]; // output
What is happening here?
EDIT
The reason this makes me curious is because something like
[0].map(String);
Will return
["0"];
And not
["0", "0", "String"]
The .map() function is calling the Array() function with three arguments, the value of the array element which is 0, the index of that element, also 0, and a reference to the whole array.
So it's like doing this:
var a = [0];
var index = 0
Array(a[index], index, a); // create array with three elements
The array returned by Array() then becomes the first element of the array that .map() creates, hence the extra level of nesting in your [[0, 0, [0]]] result.
EDIT regarding your edit: when you say [0].map(String); that results in String() being called with the same three arguments like String(a[index], index, a), but the String() function ignores all but the first argument, whereas Array() uses all supplied arguments.
Firstly, Array could be used as a function to create arrays:
var arr = Array(1, 2, "Hello");
console.log(arr); // [1, 2, "Hello"]
Secondly, map passes three parameters to its callback: the element, its index from the array and the array itself.
So, since your array contains one element, the line:
[0].map(Array);
is equivalent to:
[Array(0, 0, [0])]; // the element 0 in the original array will be mapped into Array(0, 0, [0])
After you updated question. Other answers provide you info about map
To answer why array and string differ look to constructors
String constructor accept 1 parameter String(thing) while array new Array(element0, element1[, ...[, elementN]])