2016-01-21 2 views
7

Я нашел странное поведение (проверено на Chrome)(новый Array (х)) карта stranges

[1,2].map(function() { console.log(arguments); }) 
// [1, 0, Array[2]] 
// [2, 1, Array[2]] 
// [undefined, undefined] 

и это нормально - нормально, как в документации Но

(new Array(20)).map(function() { console.log(arguments); }) 
//[undefined × 20] 

Это Безразлично» t использовать обратный вызов (никаких действий, debugger внутри не работает и т.п.). Зачем??

Синтаксис new Array(arrayLength) должен создавать массив с заданной длиной. И это так. Но что с .map?

ответ

8

От MDN:

обратного вызова вызывается только для индексов массива, которые назначили значения, в том числе не определено. Он не вызывается для отсутствующих элементов массива (то есть индексов, которые никогда не были установлены, которые были удалены или которым никогда не было присвоено значение).

Когда вы объявляете массив, используя new Array(), все элементы не определены, но они не были назначены undefined как значение. Поэтому они пропускаются при вызове map().

Вы можете использовать join() и split() явно присвоить undefined каждого элемент, а затем вы получите ожидаемый результат:

(new Array(20).join(undefined).split(undefined)).map(function() { console.log(arguments); })

+1

Хех .. Вы избили меня к нему: -) – Amit

+0

Более элегантный в ES6: '[... Array (20)]. Map (function (... args) {console.log (args);})' – nils

Смежные вопросы