Array初始化 以及 Array.prototype.map()的一些问题

前言

今天初始化数组的时候,map貌似失效了。浪费了我十几分钟的时间调试,看来我还是不够精通js啊

问题描述

初始化一个指定长度的数组,调用其map函数时,无法调用

const arr = new Array(100); 
arr.map((value) => {        
    console.log(value);        // 控制台什么东西也没有,也就是说代码没有被执行;
    return {}
})

Array初始化

let arr = new Array(100);                   // 等价于 const arr = Array(100),此时为每个元素为empty,既不是null也不是undefined。map不能调用,原因看解决方案
arr.fill(null);                             // 可以被map识别了

arr = Array.apply(null, { length: 100 });   //这种初始化,每个元素为undefined,可以被map识别了

Array.prototype.map()解决

以下是MDN的解释

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;
  • indexes which have been deleted.

上面讲到,map函数通过提供回调函数遍历数组的每一个元素,注意到的是,只有被assigned的元素也就是被赋值的元素才会被遍历到,通过Array或者Array构建函数构建的指定长度的,都是未指派的,不会遍历到。

const arr = new Array(100); 

console.log(arr);           // 控制台Array(100)

arr.map((value) => {        // 不会执行
    console.log(value);
    return {}
})

arr[2] = 2;
arr.map((value) => {        // 控制台只会输出一次,结果为:2
    console.log(value);
    return {}
})
原文地址:https://www.cnblogs.com/panshaojun/p/14205539.html