Что такое .map() в этой ситуации?

Используя консоль Chrome, это мой ввод и вывод:

[0].map(Array);

[[0, 0, [0]]]; // output

Что здесь происходит?

ИЗМЕНИТЬ

Причина, по которой мне любопытно, - это что-то вроде

[0].map(String);

Вернет

["0"];

И не

["0", "0", "String"]

Ответ 1

Функция .map() вызывает функцию Array() с тремя аргументами, значение элемента массива, которое 0, индекс этого элемента, также 0 и ссылку на весь массив.

Так оно и нравится:

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() использует все предоставленные аргументы.

Ответ 2

Во-первых, Array может использоваться как функция для создания массивов:

var arr = Array(1, 2, "Hello");

console.log(arr); // [1, 2, "Hello"]

Ответ 3

После обновления вопроса. Другие ответы предоставят вам информацию о map

Чтобы ответить на вопрос, почему массив и строка отличаются от конструкторов

Конструктор строк принимает 1 параметр String (вещь), в то время как массив новый Array (element0, element1 [,... [, elementN]])

Ответ 4

Этот вызов

[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"