我总是假设 Array.from 的行为与数组的 Array.map 相同。但似乎对于没有初始值的数组,它们是完全不同的。

arr = new Array(5);
range = Array.from(arr, (v,idx) => idx); // [0,1,2,3,4]
new_arr = arr.map((v, idx) => {return idx;}); // [undefined, undefined,undefined, undefined,undefined]

所以 Array.from 仍然能够获取索引,而这里的 arr.map 只是跳过所有值,实际上它从不调用回调函数。

JavaScript 如何处理没有初始值的数组?

最佳答案

new Array(5) 创建一个 sparse array ,这是一个带有 length 5 但实际上没有条目的数组 - 元素 0-4 不仅仅是 undefined ,它们实际上不存在。 ( 0 in arr === false )

您在上面写到 map 的结果是 [undefined, undefined, ...] 但实际上它是另一个没有元素的稀疏数组。在 Chrome Devtools 中,您会将其视为 [empty × 5]
Array.from 专门用于从类似数组的东西中创建一个常规数组。它基本上检查 length 属性并从 [0][1] 、 ...、 [length - 1] 返回的任何内容中创建一个新数组。因此,它将稀疏数组转换为一个包含 5x undefined 的密集数组,并且您的回调将调用元素 0-4。

然而 Array.prototype.map 只是迭代数组中的(现有!)元素并返回一个带有映射值的新数组。请注意,稀疏数组没有元素,因此永远不会调用您的回调,并且返回的数组看起来与以前相同。

10-07 19:56
查看更多