Array.method 和 [].method 之间的区别


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

为什么不同的数组方法以不同的方式调用?

from函数存在于Array对象本身中。因此,您需要通过Array实例调用它。您还可以使用不同于Arraynew Array[]创建数组。创建数组时,它与Array实例的功能无关。它只引用其原型链中的Array.prototype,从中获取函数和属性,例如lengthpop。一般来说,Array.prototype中的内容 - 可以从数组([])访问,Array实例本身中的内容 - 不是,您需要通过Array实例调用它们。

给定一个实例arrArrayarr.method等价于Array.prototype.method

注意里面的.prototype

所以arr.pop()会和Array.prototype.pop.call(arr)一样.但是,Array.from没有prototype,它是直接在 Array 构造函数本身上的方法,并且不能(轻松)使用数组实例访问。

如果您熟悉其他面向对象的语言(Java,C#等),Array.from本质上是一个静态方法,而Array.prototype.pop本质上是一个实例方法。

在第二种情况下,您希望map使用要应用于每个元素的函数返回修改后的数组。

[1,2,10,5].map(x => x + x); // [2,6,20,10]

在我看来,这实际上是你想要的


关于Array.from的更多解释。

这是一个"静态"的函数,这意味着它不能像您在第二行中尝试的那样应用于实际的数组实例,它只能在Array上使用。否则用Javascript术语来说,它不是Array.prototype的一部分。

文档中的描述解释了函数的用途:

寄件人 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from

Array.from() 允许您从以下位置创建数组:

类似数组的对象(具有长度属性和索引的对象 元素)或可迭代对象(您可以在其中获取其元素的对象, 如地图和设置)。

Array.from() 有一个可选的参数 mapFn, 这允许您对 正在创建的数组(或子类对象)。

更清楚的是, Array.from(obj, mapFn, thisArg) 的结果与 Array.from(obj).map(mapFn, thisArg),除了它不创建一个 中间阵列。

因此,在您的情况下,使用Array.from(yourArray, mapFunc)似乎不如简单地使用youArray.map(mapFunc)那么清楚,因为使用 Array.from 的真正兴趣是当您没有数组,而是可以转换为数组的东西时。

在这种情况下,将 mapFunction 作为第二个参数也很方便,以避免先创建一个临时数组,然后将元素映射到新的最终数组。

最新更新