我一直假设 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
但是,只需遍历数组中的(现有!)元素并返回一个带有映射值的新数组。请注意,稀疏数组没有元素,因此永远不会调用您的回调,并且返回的数组看起来与以前相同。
关于javascript - 对于没有值的数组,Arr.map 与 Array.from 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60584217/