Javascript 对于没有值的数组,Arr.map与Array.from不同

Javascript 对于没有值的数组,Arr.map与Array.from不同,javascript,Javascript,我总是假设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

我总是假设
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如何处理没有初始值的数组?

方法
array.from()
从类似数组的对象或可编辑对象创建一个新的浅复制数组实例。它不在乎是否分配了数组值,它只会从给定数组创建一个新数组

Array.map
按顺序为数组中的每个元素调用一次提供的回调函数,并根据结果构造一个新数组。回调仅对具有赋值的数组的索引调用;对于已删除的索引或从未分配过值的索引,不会调用它。“在这种情况下,
arr的
值没有显式分配值,因此map不会在该数组上迭代

Array.from
Array.map
的差异

Array.from
用于从现有的类似
数组的对象创建新数组

如果赋值,则使用
Array.map
操作数组值。

新数组(5)
创建一个数组,即长度
5
但实际上没有条目的数组-元素0-4不仅仅是
未定义的
,它们实际上不存在。(
0 in arr==false

您在上面写到,
map
的结果是
[undefined,undefined,…]
,但实际上它是另一个没有元素的稀疏数组。在Chrome开发工具中,您会将其视为
[empty×5]

Array.from
专门用于从类似数组的内容中创建常规数组。它基本上检查
length
属性,并从
[0]
[1]
,…,
[length-1]返回的内容中创建新数组
。因此,它将稀疏数组转换为密集数组,其中包含5x
未定义的
,并且为元素0-4调用回调


Array.prototype.map
但是只是在(现有的!)元素并返回具有映射值的新数组。请注意,稀疏数组没有元素,因此从未调用回调,返回的数组看起来与以前相同。

从未调用回调-通过执行
new\u arr=arr.map((v,idx)=>{console.log('map',idx);return idx;})可以看到这一点
vs
Array.from(arr,(v,idx)=>{console.log('from',idx);return idx;});
您还没有解释为什么Array.from映射回调不同:p简单的区别是“Array.from用于从类似对象的现有数组创建新数组”,如果分配了值,则Array.map用于操作数组值