Используя консоль 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"