我总是假设 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
只是迭代数组中的(现有!)元素并返回一个带有映射值的新数组。请注意,稀疏数组没有元素,因此永远不会调用您的回调,并且返回的数组看起来与以前相同。