Используя консоль Chrome, это мой ввод и вывод:
[0].map(Array);
[[0, 0, [0]]]; // output
Что здесь происходит?
ИЗМЕНИТЬ
Причина, по которой мне любопытно, - это что-то вроде
[0].map(String);
Вернет
["0"];
И не
["0", "0", "String"]
Используя консоль Chrome, это мой ввод и вывод:
[0].map(Array);
[[0, 0, [0]]]; // output
Что здесь происходит?
ИЗМЕНИТЬ
Причина, по которой мне любопытно, - это что-то вроде
[0].map(String);
Вернет
["0"];
И не
["0", "0", "String"]
Так оно и нравится:
var a = [0];
var index = 0
Array(a[index], index, a); // create array with three elements
Массив, возвращаемый Array(), затем становится первым элементом массива, созданным .map(), следовательно, дополнительный уровень вложенности в ваш результат [[0, 0, [0]]].
EDIT относительно вашего редактирования: когда вы говорите [0].map(String);, в результате чего String() вызывается с теми же тремя аргументами, что и String(a[index], index, a), но функция String() игнорирует все, кроме первого аргумента, тогда как Array() использует все предоставленные аргументы.
Во-первых, Array может использоваться как функция для создания массивов:
var arr = Array(1, 2, "Hello");
console.log(arr); // [1, 2, "Hello"] После обновления вопроса. Другие ответы предоставят вам информацию о map
Чтобы ответить на вопрос, почему массив и строка отличаются от конструкторов
Конструктор строк принимает 1 параметр String (вещь), в то время как массив новый Array (element0, element1 [,... [, elementN]])
Этот вызов
[0].map(Array);
дает вам такой же результат, как если бы вы написали что-то вроде этого:
[0].map(function (value, index, array) {
return Array(value, index, array);
})
Map функция вызывает Array с тремя параметрами: значением элемента, индексом элемента и целым массивом. Этот вызов Array возвращает массив с тремя элементами: значением (число 0), индексом (число 0), целым массивом ([0]).
И этот новый массив обернут в исходном массиве, потому что вы создали новый элемент (число 0) для нового элемента (массив из трех элементов)
Примечание. Вы можете использовать только первый параметр, например, в
array.map(function (a) { return a * a; });
или используя только два, чтобы получить также индекс
array.map(function (item, index) { return "index=" + index + ", value=" + item; });
Но вам нужно помнить, что map все еще содержит 3 параметра, которые вы просто игнорируете в своей функции обратного вызова. Это также причина, по которой код выглядит следующим образом:
[0].map(String);
возвращает
["0"]
Это потому, что функция String поддерживает только первый параметр и игнорирует другие переданные параметры. Если вы вызываете
String(11, "Some", "other", "ignored", "parameters")
вы все равно получите
"11"