Javascript 为什么Array.from不以与Array.prototype.map相同的方式调用回调?

Javascript 为什么Array.from不以与Array.prototype.map相同的方式调用回调?,javascript,ecmascript-6,callback,mapping,Javascript,Ecmascript 6,Callback,Mapping,在编写本报告时指出: Array.from()有一个可选参数mapFn,允许您对所创建数组的每个元素执行函数 更清楚地说,Array.from(obj、mapFn、thisArg) 与数组.from(obj).map(mapFn,thisArg)的结果相同 但它不创建中间数组 但是,它的行为并不完全相同,如下所示: 函数映射fn(…args){ console.log(…args); } 设obj={0:“值”,长度:1}; 设thisArg={}; 数组.from(obj、mapFn、thi

在编写本报告时指出:

Array.from()
有一个可选参数mapFn,允许您对所创建数组的每个元素执行函数

更清楚地说,
Array.from(obj、mapFn、thisArg)

与数组.from(obj).map(mapFn,thisArg)的结果相同 但它不创建中间数组

但是,它的行为并不完全相同,如下所示:

函数映射fn(…args){
console.log(…args);
}
设obj={0:“值”,长度:1};
设thisArg={};
数组.from(obj、mapFn、thisArg);
Array.from(obj.map)(mapFn,thisArg)来自MDN的引用几乎完全正确。但它也是不完整的

几乎不正确:

它允许您执行功能

它不执行本机
.map()
方法。它执行几乎相同的映射操作

残缺的

更清楚地说,
Array.from(obj、mapFn、thisArg)

与数组.from(obj).map(mapFn,thisArg)的结果相同 但它不创建中间数组

而true还应包括“只要不使用
.map()
的第三个参数。”以完全100%匹配事物的工作方式

为什么会有这种差异?让
Array.from
像MDN上面引用的函数一样工作,这不是更有意义吗

这个问题很有趣,但答案其实很无聊。这是因为您可以在非数组上使用
Array.from()

这有什么关系?您显示了一个类似于被映射的数组。类数组整体存在,可以作为第三个参数传递。事实上,它是通过实现
.map()

函数映射fn(…args){
日志(此,…args);
//^^^^^^^为了清晰起见,还应记录此信息
}
设obj={0:“值”,长度:1};
设thisArg={this:“arg”};

Array.prototype.map.call(obj、mapFn、thisArg)嗯,
thisArg
应该是传递给回调函数的
this
值。不是
map
函数的第三个参数。这是两件不同的事情。换句话说,
Array.from
不调用
map
,正如MDN令人困惑地指出的那样,它是
map
@pilchard,可能没有。至少存在一个类似(如图所示)的数组,但如果传入迭代器,则无法传递该迭代器的完全实体化视图。@georg我想wiki的意思是“允许您执行映射操作”,但它在翻译为“允许您执行.map()”时有点迷失了,如果给
Array.from
的第一个参数将作为第三个参数传递给回调函数——它涉及到迭代器——回调函数仍然可以使用该引用执行访问值以外的其他操作。例如,它可以决定调用
iter.return()
,这在某些情况下实际上可能是一种方便的可能性。@trincot,但它会导致不一致。现在您无法创建一个
mapFn
,因为最后一个参数可能是一个数组,可能是一个类似数组的数组,可能是一个生成器对象(好的,我在答案中有点作弊),可能是一个迭代器。最后一个方法甚至可能没有
.return()
,因为它是可选方法,所以您甚至可能无法调用它。像这样的数组可能有一个不符合迭代器协议的
.return()
。只是一团糟。此外,映射应该不会改变它所映射的任何内容。是的,但是在对数组执行标准的
.map
调用时,已经可以使用该参数:我可能已经决定在该数组上拥有自己的属性,或者使用一个对象作为扩展数组的类的实例,然而,我仍然能够得到那个不太标准的数组作为回调函数中的第三个参数,使我能够访问非标准方法。此外,如果在设计时我们知道我们所映射的内容的“类型”,为什么在特定场景中使用这些知识会不一致?*耸耸肩*你可以对很多事情进行论证。“但如果”。它就是这样设计的。显然,这并不真正适合你。我个人感到遗憾的是,这一点并不存在。但语言不是为你或我准备的。必须做出让步,决定要做什么以及如何使用。如果绝大多数映射不使用第三个参数,那么在不使用它的情况下运送
Array.from
似乎是一个明智的权衡与复杂性。@trincot出于兴趣,我检查了一下它是否有理由省略第三个参数。它本身并不包含一个链接,它确实链接到(与
Array.of
一起),但我没有浏览电子邮件链。该线程的标题是“纯赢:Array.from和Array.of”,因此它表明从一开始就没有第三个参数的计划。