Array.from([1,3,10,5], x => x + x); // [2,6,20,10]
[1,2,10,5].from( x => x + x); // TypeError
[1,3,10,5].pop(); // 5为什么用不同的方式调用数组的不同方法?
发布于 2018-04-19 12:02:29
给定一个实例arr of Array,arr.method等同于Array.prototype.method。
注意里面的.prototype!
所以arr.pop()和Array.prototype.pop.call(arr)是一样的。但是,Array.from中没有prototype,它是一个直接位于数组构造函数本身上的方法,不能(很容易)使用数组实例访问。
如果您熟悉其他面向对象的语言(Java、C#等),那么Array.from本质上是一个静态方法,而Array.prototype.pop本质上是一个实例方法。
发布于 2018-04-19 12:01:07
from函数存在于Array对象本身中。所以您需要通过Array实例调用它。您还可以使用new Array或[]创建一个与Array不同的数组。创建数组时,它与Array实例的函数无关。它只引用它的原型链中的Array.prototype,从中获取函数和属性,如length或pop。通常说,Array.prototype中的内容--可以从数组([])访问,Array实例本身中的内容--不是,您需要通过Array实例调用它们。
发布于 2018-04-19 12:00:56
在第二种情况下,您希望map使用要应用于每个元素的函数返回经过修改的数组。
[1,2,10,5].map(x => x + x); // [2,6,20,10]在我看来,这正是你想要的。
关于Array.from的更多解释。
这是一个“静态”函数,意味着它不能像您在第二行中尝试的那样应用到实际的数组实例上,只能在类Array上使用。如果用Javascript的话来说,这不是Array.prototype的一部分。
用于解释该功能的用途的文档说明:
Array.from()允许您从以下位置创建数组: 类似数组的对象(具有长度属性和索引元素的对象)或可迭代对象(可以在其中获取其元素的对象,如Map和Set)。 Array.from()有一个可选参数mapFn,它允许您对正在创建的数组(或子类对象)的每个元素执行映射函数。 更清楚的是,Array.from(obj,mapFn,thisArg)的结果与Array.from(obj).map(mapFn,thisArg)相同,只是它没有创建中间数组。
因此,在您的示例中,Array.from(yourArray, mapFunc)的使用似乎比简单地使用youArray.map(mapFunc)更不清楚,因为使用Array.from的真正兴趣在于您没有数组,但是可以将其转换为数组。
在本例中,还可以方便地将mapFunction作为第二个参数,以避免首先创建临时数组,然后将元素映射到新的最终数组。
https://stackoverflow.com/questions/49920564
复制相似问题