在做力扣的时候,偶然发现了一个问题,像初始化的多维数组中push元素时报错了
let res = Array(numRows).map(() => [])
res[k].push(s[i])`
当时是懵逼的,因为在之前学习《javascript高级程序设计》时,依稀记得一个数组初始化时,不填充元素,会用一个“空位”去占位,那按照这样来看,这里为什么会是undefined呢?
于是我就去问了文心一言,得到了下面的回答:
这样一看,似乎我的理解没啥问题呀?不甘心的我又去问了ChatGPT,于是有了下面的回答:
原来问题出现在了map这个高阶函数上面,我就去MDN上面搜索看了看:
map(callbackFn, thisArg)
callbackFn是为数组中每个元素执行的函数,thisArg是为了this的指向;
接着,看到了关键的一段话:
callbackFn 仅在已分配值的数组索引处被调用。它不会在稀疏数组中的空槽处被调用。
也就是说,在map()中给定的这个callbackFn在“空位”时,是不会执行的,怪不得,报错中会显示undefined,因此在了解到问题后,就不免会想一想,那怎么正确地给数组初始化呢,其实方法还挺多:
首先就是
let res = Array(numRows).fill(null).map(()=>[])
既然你的map不能在“空位”上去调用函数,那么就先给定null值,这样一来map就可以正常工作了
或许大家会觉得这样有点麻烦,那么就可以考虑使用Array.from()了:
let res = Array.from({nums.length},()=>[])
from()就不像map()会不识别空位,还是可以放心使用的。