Вы правильно выполнили этот письменный тест JS?

JavaScript
Вы правильно выполнили этот письменный тест JS?

Сводный обзор

задний план

Когда я вчера читал письменный тестовый вопрос, я думал, что это очень просто, но результат был не таким, как я себе представлял, поэтому я сразу перешел к письменному тестовому вопросу.

const array = new Array(5).map((item) => {
  return item = {
    name: '1'
  }
});
console.log(array);
// 请写出输出结果

Мой воображаемый ответ: [{имя: '1'}, {имя: '1'}, {имя: '1'}, {имя: '1'}, {имя: '1'}];

Фактический ответ: [пусто × 5]

Почему это происходит?

угадай 1

Моя первая мысль заключается в том, что массив, сгенерированный new Array(5), [undefined, undefined, undefined, undefined, undefined].

const array = [undefined, undefined, undefined, undefined, undefined];
const newArr = array.map((item) => {
  return item = {
     name: '1'
   }  
});
console.log(newArr);
// 结果是[{name: '1'}, {name: '1'}, {name: '1'}, {name: '1'}, {name: '1'}];

угадай 1 неправильно

угадай 2

Массив, сгенерированный new Array(5), не имеет значения в каждом элементе, что означает, что генерируется массив из [].

const array = [,,,,,];
const newArr = array.map((item) => {
  return item = {
     name: '1'
   }  
});
console.log(newArr);
// 结果是[empty × 5];

думаю 2 верно

Зачем

map calls a provided callback function once for each element in an array, in order, and constructs a new array from the results. callback is invoked only for indexes of the array which have assigned values (including undefined).

It is not called for missing elements of the array; that is:

  • indexes that have never been set;
  • which have been deleted; or
  • which have never been assigned a value.

map вызывает предоставленную функцию обратного вызова один раз для каждого элемента в массиве по очереди, а затем создает новый массив из результата. -----Только обращения к индексам массива присваиваемых значений (включительно)----. Функция обратного вызова функции карты будет вызываться только для элементов, которым было присвоено значение. новый массив (1) не совпадает с [undefined]. new Array(1) не присваивает значение элементу массива, а [undefined] присваивает неопределенное значение элементу массива.

Суммировать

  • Массив, созданный new Array(5), представляет собой массив без значений, присвоенных элементам в массиве.
  • map только делает вызовы обратного вызова для индексов массива присвоенных значений (включительно).

оптимизированная обработка

// 处理1
const array = new Array(5).fill().map((item) => {
  return item = {
    name: '1'
  }
});
console.log(array);
// [{name: '1'}, {name: '1'}, {name: '1'}, {name: '1'}, {name: '1'}];

// 处理2
var array = Array.apply(0,{length:5}).map((item) => {
  return item = {
    name: '1'
  }
});
console.log(array);
// [{name: '1'}, {name: '1'}, {name: '1'}, {name: '1'}, {name: '1'}];