前言
今天初始化数组的时候,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()解决
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 {}
})